Тормозят inserts в MongoDB (Doctrine 2 ODM)

mongodbНедавно на работе столкнулись с такой проблемой. Необходимо было провести импорт множества сущностей из MySQL в MongoDB. Но вот незадача, первые 200 объектов импортировались нормально, а потом скорость начала асимптотически падать стремясь к нулю.

Задача в принципе была простая, даже впилил в консольную команду Symfony 2 прогресс-бар. Кстати хорошая штука. Позволяет прикидывать как скорость процесса, так и общий прогресс. Вот он то мне и помог понять, что что-то не то. Я уже начал грешить на php, запиливать многопоточную обработку, когда коллега сказал, что надо копать не в сторону php как такового, а в сторону MongoDB и Doctrine.

GA_Technically-Speaking-Template_MongoDB

Решилось всё простою. Надо было в конце итреации цикла делать

который собственно очищает UnitOfWork, все мета-данные и т.д. Вот кстати его код:

После этого скорость вставок падать перестала, и то что занялбо у меня целые выходные выполнилось за 3 минуты 🙂

5 Comments

    1. Да, Олег. Иногда так и делаем. Но к хорошему быстро привыкаешь 🙂

  1. Также не следует забывать, что доктрайн пишет еще и все запросы в лог (Symfony 2).

    1. Да, это если есть серви ‘logger’. Но, можно выключить это для продакшена.

Leave a Comment