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();
我正在使用 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();