Doctrine MongoBundle:导入 28k 文档的最有效方法

Doctrine MongoBundle: Most efficient way to import 28k documents

我正在使用 DoctrineMongoDBBundle (Symfony 2.7.4) 通过 foreach-looping 将 28k 文档导入 MongoDB 并抛出源集合。虽然它按预期工作,但我想知道如何优化性能。我发现导入前 1000 个只需要眨眼,但导入过程会随着每次刷新而变慢。拆分源集合并导入是否有意义,例如一次100个?你多久冲一次水?

有什么最佳做法吗?

感谢您的建议!

这完全取决于可用内存和文档大小。您可以通过 $dm->getUnitOfWork()->size(); 检查 unit of work 的大小。我认为您在刷新后不会分离文档,这就是一切变慢的原因。在 flush() 之后使用 clear() 将文档与学说分离。

例如,下面应该持久化 100 个文档,在一个操作中刷新所有文档,脱离 doctrine,并对所有 $documents 重复此操作:

$batchSize = 100;
$i = 1;
foreach ($documents as $document) {
    $dm->persist($document);
    if (($i % $batchSize) === 0) {
        $dm->flush();
        $dm->clear();
    }
    $i++;
}
$dm->flush();
$dm->clear();