导入1.6M行文件的正确方法是什么?

时间:2018-06-12 15:19:11

标签: php laravel-5

我有一个Laravel 5.3项目。我需要导入和解析一个非常大的(1.6M行)文本文件。

我有内存资源问题。我想在某些时候,我需要使用chunk但是在加载文件时遇到了麻烦。

这是我正在尝试的;

    if(Input::hasFile('file')){
        $path = Input::file('file')->getRealPath(); //assign file from input
        $data = file($path); //load the file
        $data->chunk(100, function ($content) { //parse it 100 lines at a time
            foreach ($content as $line) {
                //use $line
            }
        });
    }

我知道file()将返回一个数组,而File :: get()将返回一个字符串。

我已经增加了我的php.ini上传和内存限制,以便能够处理文件大小但遇到此错误;

Allowed memory size of 524288000 bytes exhausted (tried to allocate 4096 bytes)

这是在线上发生的;

$data = file($path);

我错过了什么?和/或这是最理想的做法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如上所述,file()将整个文件读入一个数组,在本例中为160万个元素。我怀疑这是可能的。您可以逐个读取每一行,覆盖前一行:

$fh = fopen($path "r");
if($fh) {
    while(($line = fgets($fh)) !== false) {
        //use $line
    }
}

防止超时的唯一方法是设置最长执行时间:

set_time_limit(0);

答案 1 :(得分:0)

如果文件太大,你需要在没有php的情况下拆分你的文件,你可以安全地使用exec命令,如果你只想使用php解释器,你需要很多内存而且需要很长时间,linux命令可以节省你的时间运行

exec('split -C 20m --numeric-suffixes input_filename output_prefix');

之后,您可以使用Directory Iterator并阅读每个文件。

此致