我即将阅读一个大小为 200Mb 的文本文件,然后在其中编辑一些内容,然后将其保存回来。但我有错误。所以:
- 应该在 php 中修改哪些确切的设置?
还有什么文件读取方法最适合打开和解析大文件?我是说:
- 恐惧?
- 文件获取内容?
我即将阅读一个大小为 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);
}
这样,在任何给定时间,只有一小部分文件保存在内存中。我检查了效率,它很好,整个文件大约半分钟。
一个小提示 - 如果被替换的字符串位于缓冲区的末尾,它可能不会被替换。为确保您已更改所有事件,请以较小的偏移量再次运行脚本:
$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