@webmaxer
Веб разработчик

Можно как-то ускорить doctrine flush?

Здравствуйте!

Имеется 8000 товаров + категории + наличие на складе. Парсятся из сsv.
Итого при вставке доктриной выходит около 16 000 строк. По времени занимает 1 минута +- 10 секунд.
Так как вставка происходит автоматом в цикле - для избежания утечек памяти php используется конструкция
foreach(.... $key->$value) {
....... создание объектов и persist
if($key % 20 === 0 ) {
	$em->flush();
	$em->clear();
}
}
$em->flush();
$em->clear();

, благодаря которой flush кушает не 120, а 50 мб. При этом по времени потери не значительные - добавляет 10 секунд.

Интересует вопрос, нормальная ли это скорость для такого объёма данных или можно ускорить?
  • Вопрос задан
  • 903 просмотра
Решения вопроса 1
slimus
@slimus
Symfony, Golang
Тут время и память тратятся не только на flush(). Создание объекта тоже будет отнимать время.
Доктриной скорее всего ускорить не получится. Можно вставлять через pdo.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@gtr52
Попробуйте покопать в сторону:
$em->flush($object);

При реализации одной синхронизации в интернет-магазине, тоже столкнулся, что обновление занимало все больше и больше времени, с каждым следующим товаром.
$em->clear(); не помогало, как я понял при $em->flush(); - доктрина проходится по списку сущностей в памяти, которые в нее загружались и проверяет было ли изменение, так вот проверка - занимала огромное кол-во времени.
Итого при использовании $em->flush($object); - парсинг XML на 4000 товаров и обновление их данных в базе - укладывается в секунд 5-10.
Может поможет)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы