1

サイズが 200Mb のテキスト ファイルを読み込んで、その中の何かを編集してから保存しようとしています。しかし、私はエラーが発生しています。そう:

  • PHPで正確にどの設定を変更する必要がありますか?

また、大きなサイズのファイルを開いて解析するには、どのファイル読み取り方法が最適ですか? つまり:

  • フレッド?
  • file_get_contents ?
4

4 に答える 4

6

私は1GBのファイルを読んで同様のことをしなければなりませんでした。PHPを使い続けたかったので、最後にfreadを使用してファイルの一部を少しずつ読み取りました。

while (!feof($source_file)) {
    $buffer = fread($source_file, 1024);  // use a buffer of 1024 bytes
    $buffer = str_replace($old,$new,$buffer);
    fwrite($target_file, $buffer);
}

このようにして、ファイルのごく一部のみが常にメモリに保持されます。効率を確認しましたが、ファイル全体で約30分で問題ありません。

小さな注意-置き換えられた文字列がバッファの最後にある場合、置き換えられない可能性があります。すべてのオカレンスを変更したことを確認するには、小さなオフセットを使用してスクリプトを再度実行します。

$buffer = fread($source_file, 512);
fwrite($target_file, $buffer);  
while (!feof($source_file)) {
    $buffer = fread($source_file, 1024);  // use a buffer of 1024 bytes
    $buffer = str_replace($old,$new,$buffer);
    fwrite($target_file, $buffer);
}
于 2012-08-27T12:54:04.683 に答える
1

既存の回答とほとんど同じですが、ファイルポインターがあります。

$original = fopen("/tmp/inputfile.txt", "r");
$new = fopen("/tmp/outputfile.txt", "w");
if ($original && $new) {
    while (($buffer = fgets($handle)) !== false) {
        //do modification on $buffer (which is a single line)

        fwrite($new, $buffer);
    }

    fclose($original);
    fclose($new);
}
于 2012-08-27T12:56:13.403 に答える
0

以下を使用して、同様のタスクを完了します。

$file = file_get_contents("/path/to/file");
$lines = explode("\n", $file);

$arr = preg_grep("/search_string/", $lines);

// $arr is now a smaller array of things to match
// do whatever here

// write back to file
file_put_contents("/path/to/file", implode("\n", array_merge($arr, $lines)));
于 2012-08-27T14:03:10.470 に答える
-5

PHP は、これを行うように設計されておらず、意図もしていません。Perl を使用するか、テキストを XML に変更するか、データベースに入れることを検討してください。

意図したとおりにこれを行うと、ファイル全体がメモリにロードされます。複数のユーザーが同じことをしている場合、メモリがすぐに不足します。

XML 解析については、こちらをご覧くださいXMLReader

于 2012-08-27T12:52:13.907 に答える