我正在尝试解析一个以制表符分隔的文件,它的大小约为1 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)有没有办法打开文件的一部分,然后转到下一部分,这样一次占用的内存就会更少?
发布于 2013-02-13 16:04:18
可以,您可以逐行阅读:
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
echo $buffer;
}
fclose($handle);
}发布于 2013-02-13 16:07:43
你必须使用块来读取文件。检查这个问题的答案。https://stackoverflow.com/a/6564818/1572528
您也可以尝试将其用于较小的文件。
ini_set('memory_limit', '32M'); //max size 32m发布于 2013-02-13 16:06:14
你确定失败的是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的路径是否正确?也许可以尝试在这里为文件名设置一个绝对路径。
https://stackoverflow.com/questions/14848933
复制相似问题