サイズが 200Mb のテキスト ファイルを読み込んで、その中の何かを編集してから保存しようとしています。しかし、私はエラーが発生しています。そう:
- PHPで正確にどの設定を変更する必要がありますか?
また、大きなサイズのファイルを開いて解析するには、どのファイル読み取り方法が最適ですか? つまり:
- フレッド?
- file_get_contents ?
サイズが 200Mb のテキスト ファイルを読み込んで、その中の何かを編集してから保存しようとしています。しかし、私はエラーが発生しています。そう:
また、大きなサイズのファイルを開いて解析するには、どのファイル読み取り方法が最適ですか? つまり:
私は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);
}
既存の回答とほとんど同じですが、ファイルポインターがあります。
$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);
}
以下を使用して、同様のタスクを完了します。
$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)));
PHP は、これを行うように設計されておらず、意図もしていません。Perl を使用するか、テキストを XML に変更するか、データベースに入れることを検討してください。
意図したとおりにこれを行うと、ファイル全体がメモリにロードされます。複数のユーザーが同じことをしている場合、メモリがすぐに不足します。
XML 解析については、こちらをご覧くださいXMLReader