Php MongoBundle原则:导入28k文档的最有效方法

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()检查工作单元的大小。我想你不会在刷新后分离文档,这就是为什么

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

有什么最佳实践吗


谢谢你的建议

这完全取决于可用内存和文档大小。您可以通过
$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。