我有一个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);
我错过了什么?和/或这是最理想的做法吗?
谢谢!
答案 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并阅读每个文件。
此致