3

大きな csv ファイル (約 30M) があり、php プログラムを使用して読み取り、別の形式に変換して別の小さなファイルとして保存します。従来の fopen 、 fwrite メソッドを使用していると、 というエラーが表示されますFatal error: Allowed memory size of 134217728 bytes exhausted。php.ini でメモリ制限を設定できることは承知していますが、ファイルをストリームとして読み取って、多くのメモリ オーバーヘッドが発生しないようにする方法はありますか? StreamReaderJava のクラスのようなものでしょうか?

4

1 に答える 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 に答える