如何提高 symfony 中大数据导入的性能?
How can I improve the performance of a large data import in symfony?
我必须从大约 100,000 条记录的大型 csv 文件导入数据库。
为此,我尝试了 dql 和 orm,但是使用这两个选项我需要大约 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()
有时会很慢,因为它读取数据块的方式,但这是对如此低级别的性能影响,我不会打扰它,除非分析器告诉我。
我必须从大约 100,000 条记录的大型 csv 文件导入数据库。
为此,我尝试了 dql 和 orm,但是使用这两个选项我需要大约 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()
有时会很慢,因为它读取数据块的方式,但这是对如此低级别的性能影响,我不会打扰它,除非分析器告诉我。