大きな csv ファイル (約 30M) があり、php プログラムを使用して読み取り、別の形式に変換して別の小さなファイルとして保存します。従来の fopen 、 fwrite メソッドを使用していると、 というエラーが表示されますFatal error: Allowed memory size of 134217728 bytes exhausted
。php.ini でメモリ制限を設定できることは承知していますが、ファイルをストリームとして読み取って、多くのメモリ オーバーヘッドが発生しないようにする方法はありますか? StreamReader
Java のクラスのようなものでしょうか?
質問する
4406 次
1 に答える
7
fgets()
毎回変数を再割り当てする場合は、ファイルを一度に1行ずつ読み取ることができます(行を配列などに保存せず、メモリに残ります)。
片道、〜 65 MB のファイルを使用:
// load the whole thing
$file = file_get_contents('hugefile.txt');
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '66.153938293457 MB'
2 番目の方法:
// load only one line at a time
$fh = fopen('hugefile.txt', 'r');
while ($line = fgets($fh)) {}
echo memory_get_peak_usage() / 1024 / 1024, ' MB';
// prints '0.62477111816406 MB'
また、データを別の形式で並べ替えたい場合は、fgetcsv()
代わりに使用するように各行を CSV として解析できます。
于 2012-05-03T06:14:53.113 に答える