首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取和解析超大型文件的内容

读取和解析超大型文件的内容
EN

Stack Overflow用户
提问于 2013-02-13 16:01:53
回答 4查看 29.6K关注 0票数 8

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

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

代码语言:javascript
复制
Fatal error: Allowed memory size of 1895825408 bytes exhausted  (tried to allocate 1029206974 bytes) ...

我现在的脚本是:

代码语言:javascript
复制
$file = file_get_contents('allCountries.txt') ;

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

我将php.ini中的内存限制设置为-1,结果如下:

代码语言:javascript
复制
Fatal error: Out of memory (allocated 1029963776) (tried to allocate 1029206974 bytes)

有没有办法打开文件的一部分,然后转到下一部分,这样一次占用的内存就会更少?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-13 16:04:18

可以,您可以逐行阅读:

代码语言:javascript
复制
$handle = @fopen("/tmp/inputfile.txt", "r");
if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
        echo $buffer;
    }
    fclose($handle);
}
票数 12
EN

Stack Overflow用户

发布于 2013-02-13 16:07:43

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

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

代码语言:javascript
复制
ini_set('memory_limit', '32M'); //max size 32m
票数 2
EN

Stack Overflow用户

发布于 2013-02-13 16:06:14

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

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

如果以上这些都不是您的问题,那么您可以考虑使用fgets逐行读取文件,并在执行过程中进行处理。

代码语言:javascript
复制
$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的路径是否正确?也许可以尝试在这里为文件名设置一个绝对路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14848933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档