Doctrine MongoBundle: самый эффективный способ импортировать 28 тыс. Документов

Я импортирую 28 000 документов в MongoDB, используя DoctrineMongoDBBundle (Symfony 2.7.4), с помощью цикла foreach бросил коллекцию исходного кода. Хотя он работает, как и ожидалось, мне было интересно, как оптимизировать производительность. Я обнаружил, что импорт первой 1000 занимает всего одно мгновение, но процесс импорта замедляется с каждым сбросом. Имеет ли смысл разделять исходную коллекцию и импортировать, например, 100 за один раз? Как часто вы бы промыть?

Есть ли лучшие практики?

Спасибо за ваши предложения!

2

Решение

Все зависит от доступной памяти и размера документов. Вы можете проверить размер 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();
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]