通过PHP CLI将大型CSV导入外部导入器会导致memory_limit问题

时间:2014-03-02 18:46:56

标签: php performance csv import command-line-interface

我在将包含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问题。这是一些pseude代码

$csvLib = new foo();
$foreignImporter = new bar();

while ($thausendRows) {

    $tmpFile = $csvClass->writeCSV($thausendRows);
    $foreignImporter->doImport($tmpFile);

}

在绝望中我还试图将循环中的csvLib和foreignImporter设置为null并在循环后取消设置它们,但这并没有改变任何东西。

任何想法如何以小块运行doImport以免它破坏?我在本地计算机上将内存限制增加到2G,并获得了前100,000行importet。但这根本不是选择。

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决问题的方法。泄漏外来部分的内存被外包到自己的脚本中。我的脚本部分读取CSV。现在我遍历行和每1000行我编写一个tmp CSV并使用此tmpCSV在其自己的脚本中调用外部部分。而不是$ foreignImporter-> doImport($ tmpFile);我做passthrough(' script.php')。就这样。容易......如果你知道:)