Я импортирую 28 000 документов в MongoDB, используя DoctrineMongoDBBundle (Symfony 2.7.4), с помощью цикла foreach бросил коллекцию исходного кода. Хотя он работает, как и ожидалось, мне было интересно, как оптимизировать производительность. Я обнаружил, что импорт первой 1000 занимает всего одно мгновение, но процесс импорта замедляется с каждым сбросом. Имеет ли смысл разделять исходную коллекцию и импортировать, например, 100 за один раз? Как часто вы бы промыть?
Есть ли лучшие практики?
Спасибо за ваши предложения!
Все зависит от доступной памяти и размера документов. Вы можете проверить размер unit of work
от $dm->getUnitOfWork()->size();
, Я думаю, что вы не отрываете документы после сброса, поэтому все замедляется. использование clear()
после flush()
отделить документы от доктрины.
Например, после следует сохранить 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();
Других решений пока нет …