更快坚持和冲洗教义mongodb odm导入

时间:2012-08-30 16:26:15

标签: symfony doctrine-odm import-from-csv

我正在使用symfony2和doctrine mongodb odm从CSV文件导入产品数据。我创建了一个控制台命令来创建Product个对象,然后保留它们并刷新DocumentManager。冲洗时间超过30秒,我只有几千种产品。未来可能会有更多。

我想知道是否有任何优化/最佳实践可以在学说中更快地刷新大量新对象。似乎不需要对对象进行那么多处理,因为它们都是新的,只需要添加到集合中。

2 个答案:

答案 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();