我正在使用symfony2和doctrine mongodb odm从CSV文件导入产品数据。我创建了一个控制台命令来创建Product
个对象,然后保留它们并刷新DocumentManager
。冲洗时间超过30秒,我只有几千种产品。未来可能会有更多。
我想知道是否有任何优化/最佳实践可以在学说中更快地刷新大量新对象。似乎不需要对对象进行那么多处理,因为它们都是新的,只需要添加到集合中。
答案 0 :(得分:1)
我遇到了类似的问题(从csv加载成千上万的产品)。我的问题更多地围绕着内存耗尽,但解决方案显示速度也显着提高。
基本上,我在循环中放置了一个计数器并刷新了管理器,然后经常清除它。我发现150个批量大小产生了最好的结果。我确信它在很大程度上取决于你是如何处理它的,因为我在插入之前有很多数字运算来清理数据。
作为参考,它加载了大约5,500种具有100多个字段的产品,并在大约20秒内对它们进行处理。在修改之前花了3到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条记录。
答案 1 :(得分:-1)
我有一个非常大的数据库。我发现每次插入代码时都更有效地进行刷新,以便更好地管理对数据库的访问。
$dm->persist($object);
$dm->flush();
$dm->clear();