Tengo una consulta que selecciona todo de la tabla de la base de datos y lo escribe en un archivo de texto. Si el estado es pequeño (digamos un máximo de 200k filas), el código aún funciona y lo escribe en el archivo de texto. El problema surge cuando tengo un estado que tiene 2 millones de filas cuando se consulta, luego también está el hecho de que la tabla tiene 64 columnas.
Aquí hay una parte del código:
$file = "file2.txt"; $fOpen = fopen($file, "a"); // Open file, write and append $qry = "SELECT * FROM tbl_two WHERE STE='48'"; $res = mysqli_query($con, $qry); if(!$res) { echo "No data record" . "<br/>"; exit; } $num_res =mysqli_num_rows($res); for ($i=0; $i<=$num_res; $i++) { $row = mysqli_fetch_assoc ($res); $STATE = (trim($row['STATE'] === "") ? " " : $row['STATE']); $CTY = (trim($row['CTY']=== "") ? " " : $row['CTY']); $ST = (trim($row['ST']=== "") ? " " : $row['ST']); $BLK = (trim($row['BLK']=== "") ? " " : $row['BLK']); .... .... //64th column $data = "$STATE$CTY$ST$BLK(to the 64th variable)\r\n"; fwrite($f,$data); } fclose($f);Intenté poner un límite a la consulta:
$qry = "SELECT * FROM tbl_two WHERE STE='48' LIMIT 200000";El problema es que solo escribe hasta la línea 200k y no escribe las líneas restantes de 1,8 millones.
Si no pongo un límite a la consulta, se encuentra con el error Out of memory .... . TIA para cualquier tipo de sugerencias.
Primero debe usar la consulta de búfer para obtener los datos Léalo
Las consultas utilizan el modo de búfer de forma predeterminada. Esto significa que los resultados de la consulta se transfieren inmediatamente del servidor MySQL a PHP y luego se guardan en la memoria del proceso PHP.
Las consultas MySQL sin búfer ejecutan la consulta y luego devuelven un recurso mientras los datos aún están esperando en el servidor MySQL para ser recuperados. Esto usa menos memoria en el lado de PHP, pero puede aumentar la carga en el servidor. A menos que el conjunto de resultados completo se obtenga del servidor, no se pueden enviar más consultas a través de la misma conexión. Las consultas sin búfer también se pueden denominar "resultado de uso".
NOTA: las consultas almacenadas en búfer deben usarse en los casos en los que espera solo un conjunto de resultados limitado o necesita saber la cantidad de filas devueltas antes de leer todas las filas. El modo sin búfer debe usarse cuando espera resultados más grandes.
También optimice la matriz, intente poner la variable directamente y usted mientras se repite solo
pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $uresult = $pdo->query("SELECT * FROM tbl_two WHERE STE='48' LIMIT 200000"); if ($uresult) { $lineno = 0; while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { echo $row['Name'] . PHP_EOL; // write value in text file $lineno++; } }