Php 读取和分析非常大文件的内容

Php 读取和分析非常大文件的内容,php,file,file-get-contents,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

我正在尝试解析一个大小约为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)

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

是的,您可以逐行读取:

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

您确定失败的是
fopen
,而不是脚本的超时设置吗?默认值通常约为30秒左右,如果文件读取时间超过30秒,则可能会出错

另一个要考虑的问题可能是脚本上的内存限制——将文件读入数组可能会跳过这个问题,因此检查错误日志是否有内存警告。 如果以上两项都不是您的问题,您可以考虑使用来逐行读取文件,边处理边处理

$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
的路径是否正确?也许可以尝试在此处设置文件名的绝对路径。

您必须使用块来读取文件。检查这个问题的答案。

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

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

是,使用fopen和fread/fgets进行此操作:

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

为什么不逐行处理文件?!我很惊讶没有人提到生成器,请在这里检查我的答案:如果我只是将文件加载到内存中,它将在大约2秒钟内发生,错误发生在str_replace上,但我会逐行尝试建议。错误发生在str_replace上,因为在这种情况下,php会尝试将相同大小的内存复制到另一个变量中。为了简单起见,请使用fgetcsv()
string fread ( resource $handle , int $length )