【发布时间】:2014-03-02 18:46:55
【问题描述】:
我在将包含 400.000 行的大型 CSV 文件导入数据库时遇到问题。这些最终导入是由一个外国导入脚本完成的,该脚本在黑匣子中发挥了一些作用,我无法影响它。该脚本导致 memory_limit 问题,但正如我所说,我必须使用它。我现在的问题是运行整个导入。我尝试过的如下:
loop with while over original csv
read 1000 rows from csv
create a new file with these rows
give this new csv to doImport() function of the importer
但是外部脚本仍然会导致memory_limit 问题。这是一些伪代码
$csvLib = new foo();
$foreignImporter = new bar();
while ($thausendRows) {
$tmpFile = $csvClass->writeCSV($thausendRows);
$foreignImporter->doImport($tmpFile);
}
在极度绝望中,我还尝试将循环内的 csvLib 和 foreignImporter 实例化为 null 并在循环后取消设置它们,但这并没有改变什么。
任何想法如何以小块运行 doImport 以使其不会中断?我将本地计算机上的内存限制增加到 2G,并且它获得了前 100.000 行 importet。但这根本不是选择。
【问题讨论】:
-
缓冲并分块导入
-
“缓冲”是什么意思。我已经把它分成了 1000 行块?
-
请告诉我你知道缓冲区是什么。
-
我不是以英语为母语的人,所以我可能理解错了。当您说“缓冲区”时,我想到的是 ob_xy 函数,但我不明白它们可以帮助我解决问题吗?
-
在我看来,foreignImporter 没有正确释放内存
标签: php performance csv import command-line-interface