我正在使用 symfony2 和学说 mongodb odm 从 CSV 文件导入产品数据。我创建了一个控制台命令来创建Product
对象,然后将它们持久化并刷新DocumentManager
. 冲洗需要 30 秒以上,而我只有几千种产品。未来可能还会有更多。
我想知道是否有任何优化/最佳实践可以在原则上更快地刷新大量新对象。似乎不需要对对象进行太多处理,因为它们都是新的,只需要添加到集合中即可。
我正在使用 symfony2 和学说 mongodb odm 从 CSV 文件导入产品数据。我创建了一个控制台命令来创建Product
对象,然后将它们持久化并刷新DocumentManager
. 冲洗需要 30 秒以上,而我只有几千种产品。未来可能还会有更多。
我想知道是否有任何优化/最佳实践可以在原则上更快地刷新大量新对象。似乎不需要对对象进行太多处理,因为它们都是新的,只需要添加到集合中即可。
我遇到了类似的问题(从 csv 加载数千种产品)。我的问题更多地围绕着内存不足,但解决方案也显示出速度的显着提高。
本质上,我在循环中放置了一个计数器并刷新了管理器,然后每隔一段时间就清除它。我发现 150 批大小产生了最好的结果。我确信这在很大程度上取决于您如何处理它,因为我在插入数据之前进行了大量的数字运算以清理数据。
作为参考,它加载了大约 5,500 个具有 100 多个字段的产品,并在大约 20 秒内对其进行处理。修改前需要 3 多分钟(如果由于内存不足而完全完成的话。)
//LOOP {
if ($count % $batchSize == 0) {
$manager->flush();
$manager->clear();
gc_collect_cycles();
if ($count % $batchSize == 0)
echo $count . ' | ' . number_format((memory_get_usage() / 1024), 4) . " KBs\n";
}
$count++;
}
不要忘记在循环完成后至少再运行一次 $manager->flush() 以捕获那些不会在循环中触发它的 1-149 条记录。
我有一个非常大的数据库。我发现每次插入代码时进行刷新更有效,可以更好地管理对数据库的访问。
$dm->persist($object);
$dm->flush();
$dm->clear();