如何提高 symfony 中大数据导入的性能?

How can I improve the performance of a large data import in symfony?

我必须从大约 100,000 条记录的大型 csv 文件导入数据库。

为此,我尝试了 dqlorm,但是使用这两个选项我需要大约 9 个小时才能完成过程。

我用 Node.js 进行了相同的加载,速度更快,大约 5 分钟。

所以不知道有没有办法

我已经尝试在文件的每 20 行之后进行清理和刷新,但它仍然很慢

知道如何改进此性能。

谢谢。

根据导入的外观,您可能希望完全绕过 Doctrine ORM,并获得从实体管理器到 work with the DBAL 的连接。这样您就可以从 CSV 中检索数组,然后插入它们。

$dbal= $this->entityManager->getConnection();
$handle = fopen('exported_data.csv', 'r');
while (($row = fgetcsv($handle)) !== false)) {
    if (null === $row) {
        // Deal with invalid csv data
    }
    // maybe map row names to column names
    $dbal->insert('table_name', $row);
}
fclose($handle);

这应该已经有所改善。接下来你要看看 transactions and inserting in small batches 是否有意义。幸运的是,由于您不必处理对象水合和 ORM 的工作单元,因此您不必每次都清理。

您可能还想查看 Doctrine Batch Utils 来自 ocramius(Doctrine 贡献者之一)的任务。

如果之后您仍然遇到性能问题,您应该开始使用 blackfire or xhprof 等工具分析您的应用程序。这将告诉您,您的代码的哪一部分实际上导致了性能问题。它可能是磁盘 I/O 甚至 fgetcsv() 有时会很慢,因为它读取数据块的方式,但这是对如此低级别的性能影响,我不会打扰它,除非分析器告诉我。