4

比較的小さなデータのチャンクでphpでファイルを読み取る最良の方法は何ですか?

たとえば、5MB を読み取り、そのメモリを解放して、別の 5MB を読み取ります。

巨大なファイルを読み取って CSV に変換する必要がある解析ツールを php で作成しています。

私の問題は、許可されているメモリ制限を常に超えていることであり、私の環境ではそれを増やすことはできません。

これは、ジョブを完了するコードの一部です。

$i = 0;
$fileName = "test.txt";
$file = fopen($fileName,'r');

while($i <= 2000) {
    $line = fgets($file);
    $streetsheet[$i] = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
    ++$i;
}

fclose($file);
$fp = fopen('result.csv','w');

foreach($streetsheet as $key=>$value) {
    fputcsv($fp, $value);
}

たとえば、上の抜粋では、ファイルの最初の 2000 行を読み取っていますが、問題なく動作しています。

条件を次のように変更すると問題が発生します

while(!feof($file)){\*....*\}

許可されたメモリ制限を超えたことがすぐにわかり、問題の原因となっている行は preg_split を使用している行であることがわかります。

それで、ファイルを読むための最良の方法は何だろうか...一度に1000行ですか?

ありがとう!

反対票を投じる場合は、少なくとも理由を説明する一般的な礼儀を持ってください

4

1 に答える 1

3

あなたはすでにそれを「部分」で読んでいます: あなたはそれを行ごとに読んでいます. 問題は、すべての行を配列に貼り付けてから、配列をダンプしていることです。

代わりに、行を読み取って行を出力し、配列を完全にスキップします。

$fileName = "test.txt";
$file = fopen($fileName,'r');
$fp = fopen('result.csv','w');

while(!feof($file)) {
    $line = fgets($file);
    $value = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
    fputcsv($fp, $value);
}

fclose($file);
fclose($fp);
于 2013-04-25T00:30:51.113 に答える