Quando si esportano dati in un file di grandi dimensioni, cerco di prendere l'abitudine di generare in modo incrementale i dati in blocchi, per evitare di leggere l'intero file di grandi dimensioni in memoria. Come esempio per mostrare cosa intendo:
$fp = fopen('path/to/file.txt', 'r');
while (!feof($fp)) {
echo fread($fp, 8192);
}
fclose($fp);
Questa stessa pratica sarebbe possibile quando si recuperano i valori da un risultato del database? Se é cosi, come? Per quanto ne so, la possibilità di recuperare i risultati unbuffered da MySQL si applica solo a una riga per riga - e non per colonna.
Un esempio di base è mostrato di seguito (sono consapevole che l'estensione mysql è deprecata - questo è solo a scopo illustrativo):
$q = mysql_incremental('SELECT 'filedata' FROM 'large_files' WHERE 'id' = 1');
while (!mysql_incremental_eof($q, 'filedata')) {
echo mysql_fetch_incremental($q, 'filedata');
}
mysql_free_result($q);
Una possibile soluzione che ho pensato è quella di combinare più query per porzioni del file, facendo uso della funzione SUBSTRING()
disponibile in MySQL. Immagino che anche se questo potrebbe essere più efficiente in termini di memoria, mi chiedo quale sarebbe l'effetto sull'utilizzo della rete e sull'attività del disco?