1

我正在使用 symfony2 和学说 mongodb odm 从 CSV 文件导入产品数据。我创建了一个控制台命令来创建Product对象,然后将它们持久化并刷新DocumentManager. 冲洗需要 30 秒以上,而我只有几千种产品。未来可能还会有更多。

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

4

2 回答 2

2

我遇到了类似的问题(从 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 条记录。

于 2012-12-26T20:21:40.813 回答
-1

我有一个非常大的数据库。我发现每次插入代码时进行刷新更有效,可以更好地管理对数据库的访问。

$dm->persist($object);
$dm->flush();
$dm->clear();
于 2013-07-03T13:47:01.640 回答