我正在尝试解析大小约为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)
是否有部分打开文件,然后转到下一部分,以便一次用尽更少的内存?
答案 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你也可以稍后设置位置....