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

时间:2018-10-16 17:45:35

标签: symfony doctrine-orm symfony-3.4 symfony3.x

我必须从大型csv文件(大约100,000条记录)中导入db。

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

我使用Node.js进行了相同的加载,并且运行速度要快得多,大约5分钟。

所以我不知道是否有任何选择。

每20行文件我都尝试清洁和冲洗一次,但是它仍然很慢

任何想法如何提高这种性能。

谢谢。

1 个答案:

答案 0 :(得分:1)

根据导入的外观,您可能希望完全绕过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中的工作单元,因此您不必每次都进行清洁。

您可能还想看看来自教义的贡献者之一的ocramius的Doctrine Batch Utils

如果此后仍然存在性能问题,则应开始使用blackfirexhprof之类的工具对应用程序进行性能分析。这将告诉您,代码的哪一部分实际上导致了性能问题。可能是磁盘I / O,甚至fgetcsv()有时也可能很慢,因为它读取数据块的方式不同,但这对性能的影响是如此之低,以至于我不会理会它,除非探查员告诉我。