@galliard

Как не вываливаться в memory limit при работе с доктриной?

Есть консольный скриптик, который работает пол часа где-то и должен внести в базу несколько миллионов записей. Проблема в том, что в какой-то момент я упираюсь в память, при том что скрипту выделено 2 ГБ. Увеличивать не вижу смысла - все равно сожрет, не сейчас - так позже.

Скорее всего это происходит потому, что доктрина что-то там кэширует внутри себя, но как это все отчистить?
$this->entityManager->clear();
не помогает.

Переписывать на sql не предлагать, скрипт большой, сложный, переписывать придется овердохрена.
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
part_os
@part_os
Сложное в простом
1. выполняйте пачками, выберите оптимальное количество 100, 500, 1000
2. между пачками зачищайте доктрину, и мусор
use Doctrine\Persistence\ManagerRegistry;
 private ManagerRegistry $registry;

        $this->registry->reset();
        
        foreach ($this->registry->getConnections() as $connection) {
            $connection->close();
        }

        gc_collect_cycles();
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Попробуйте уменьшить выборки и вставки, по чаще вызывайте очистку энтити менеджера, где это уместно. Запускайте сборщик мусора
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы