Задать вопрос
@Kirill-Gorelov
С ума с IT

Doctrine detach?

Есть симфони команда, которая проверять в БД наличие определенных записей и добавляет новые.
При добавление новых записей мы падаем по памяти в 128М. Нужно сделать что бы мы не падали.
public function execute(InputInterface $input, OutputInterface $output): int
    {
        $batchSize = 50;
        $existingDeviceSerialNumbers = ['1', ..........'10000'];

        $toSave = [];
        for ($i = $startSerialNumber; $i <= $stopSerialNumber; $i++) {
            if (in_array((string)$i, $existingDeviceSerialNumbers, true)) {
                continue;
            }

            $entityDto = new Entity(........);
            $entity = $this->repository->create($entityDto);
            $toSave[] = $entity;
            $output->writeln(sprintf('count %d', $i));

            if ((count($toSave) % $batchSize) === 0) {
                $this->unitOfWork->saveChanges($toSave);
                foreach ($toSave as $item) {
                    $this->entityManager->detach($item);
                }
                $this->unitOfWork->clear();
                $toSave = [];
            }
        }

        if ($toSave !== []) {
            $this->unitOfWork->saveChanges($toSave);
        }
        return Command::SUCCESS;
    }


Почему-то утекает память....
Хотя используем detach и clear
И падаем по памяти, буду рад любому замечанию....
  • Вопрос задан
  • 261 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@usr58
наверное, можно не откреплять сущность если мы используем clear в конце цикла

у меня так работает:
$this->entityManager->clear();
gc_collect_cycles();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Массив $toSave не очищается после обработки батча.
Ответ написан
Ваш ответ на вопрос

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

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