读取并解析非常大的文件的内容

时间:2013-02-13 08:01:53

标签: php file file-get-contents

我正在尝试解析大小约为1GB的制表符分隔文件。

我运行脚本的地方我得到了:

Fatal error: Allowed memory size of 1895825408 bytes exhausted  (tried to allocate 1029206974 bytes) ...

目前我的剧本只是:

$file = file_get_contents('allCountries.txt') ;

$file = str_replace(array("\r\n", "\t"), array("[NEW*LINE]", "[tAbul*Ator]"), $file) ;

我已将php.ini中的内存限制设置为-1,然后给出了:

Fatal error: Out of memory (allocated 1029963776) (tried to allocate 1029206974 bytes)

是否有部分打开文件,然后转到下一部分,以便一次用尽更少的内存?

4 个答案:

答案 0 :(得分:11)

是的,你可以逐行阅读:

$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer;
    }
    fclose($handle);
}

答案 1 :(得分:2)

您必须使用块来读取文件。检查这个问题的答案。 https://stackoverflow.com/a/6564818/1572528

您也可以尝试将此用于较小的文件。

ini_set('memory_limit', '32M'); //max size 32m

答案 2 :(得分:1)

你确定它是fopen失败而不是你的脚本的超时设置吗?默认值通常约为30秒左右,如果您的文件花费的时间超过了读取的时间,则可能会使文件绊倒。

要考虑的另一件事可能是脚本的内存限制 - 将文件读入数组可能会超过此值,因此请检查错误日志中的内存警告。

如果上述问题都不是您的问题,您可以考虑使用fgets逐行读取文件,然后进行处理。

$handle = fopen("/tmp/uploadfile.txt", "r") or die("Couldn't get handle");
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        // Process buffer here..
    }
    fclose($handle);
}

修改

  

PHP似乎没有抛出错误,它只返回false。

$rawfile的路径相对于脚本运行的位置是否正确?也许尝试在这里为文件名设置一个绝对路径。

答案 3 :(得分:1)

是的,请使用fopen和fread / fgets:

http://www.php.net/manual/en/function.fread.php

string fread ( resource $handle , int $length )

将$ length设置为您要读取的文件数。 然后$ handle保存新读取的位置,用fseek你也可以稍后设置位置....