【问题标题】:Import of large CSV via PHP CLI to Foreign importer causes memory_limit Problems通过 PHP CLI 将大型 CSV 导入到外部导入器会导致 memory_limit 问题
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 2015-09-02
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多