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