Php MongoBundle原则:导入28k文档的最有效方法
我使用DoctrineMongoDBBundle(Symfony 2.7.4)通过foreach循环将28k文档导入到MongoDB源集合中。虽然它按预期工作,但我想知道如何优化性能。我发现导入前1000个只需眨眼,但导入过程会随着每次刷新而减慢。拆分源集合并一次导入(例如100个)有意义吗?你多久冲一次水 有什么最佳实践吗Php MongoBundle原则:导入28k文档的最有效方法,php,mongodb,symfony,doctrine-odm,Php,Mongodb,Symfony,Doctrine Odm,我使用DoctrineMongoDBBundle(Symfony 2.7.4)通过foreach循环将28k文档导入到MongoDB源集合中。虽然它按预期工作,但我想知道如何优化性能。我发现导入前1000个只需眨眼,但导入过程会随着每次刷新而减慢。拆分源集合并一次导入(例如100个)有意义吗?你多久冲一次水 有什么最佳实践吗 谢谢你的建议 这完全取决于可用内存和文档大小。您可以通过$dm->getUnitOfWork()->size()检查工作单元的大小。我想你不会在刷新后分离文档,这就是为什么
谢谢你的建议 这完全取决于可用内存和文档大小。您可以通过
$dm->getUnitOfWork()->size()检查工作单元的大小代码>。我想你不会在刷新后分离文档,这就是为什么一切都会变慢的原因。在flush()
之后使用clear()
将文档与条令分离
例如,以下操作应保留100个文档,在一次操作中刷新所有文档,从条令中分离,并对所有$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();
很简单,不要为此目的使用ODM。