PHP阅读&;解析大文件


PHP to read & parse big sized file?

我将读取一个大小为200Mb的文本文件,然后编辑其中的内容,然后将其保存回。但我有错误。因此:

  • php中应该修改哪些确切的设置

还有什么文件读取方法最适合打开&解析大型文件?我的意思是:

  • fread
  • 文件集内容

我不得不做类似的事情,读取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