我必须从大型csv文件(大约100,000条记录)中导入db。
为此,我尝试了 dql 和 orm ,但是使用这两个选项,大约需要9个小时才能完成该过程。
我使用Node.js进行了相同的加载,并且运行速度要快得多,大约5分钟。
所以我不知道是否有任何选择。
每20行文件我都尝试清洁和冲洗一次,但是它仍然很慢
任何想法如何提高这种性能。
谢谢。
答案 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。
如果此后仍然存在性能问题,则应开始使用blackfire或xhprof之类的工具对应用程序进行性能分析。这将告诉您,代码的哪一部分实际上导致了性能问题。可能是磁盘I / O,甚至fgetcsv()
有时也可能很慢,因为它读取数据块的方式不同,但这对性能的影响是如此之低,以至于我不会理会它,除非探查员告诉我。