Doctrine orm 条令2大批量更新

Doctrine orm 条令2大批量更新,doctrine-orm,symfony-3.4,Doctrine Orm,Symfony 3.4,我正在使用Symfony 3.4和Doctrine。 我需要使用条令更新大量实体(300k+)。 我读过《条令文档》中的批处理文章,也读过堆栈中的主题,但问题是,尽管批处理的大小(20100200500)很大,但当我接近20k个已处理实体时,还是会出现“内存不足”错误 这是我的功能 有人能给我一个如何避免这种情况的提示/建议吗 protected function execute(InputInterface $input, OutputInterface $output): void {

我正在使用Symfony 3.4和Doctrine。 我需要使用条令更新大量实体(300k+)。 我读过《条令文档》中的批处理文章,也读过堆栈中的主题,但问题是,尽管批处理的大小(20100200500)很大,但当我接近20k个已处理实体时,还是会出现“内存不足”错误

这是我的功能

有人能给我一个如何避免这种情况的提示/建议吗

protected function execute(InputInterface $input, OutputInterface $output): void
{
    $io          = new SymfonyStyle($input, $output);
    $em          = $this->getContainer()->get('doctrine.orm.entity_manager');
    $em->getConfiguration()->setSQLLogger(null);

    $repository  = $em->getRepository('AppBundle:Order');
    $qb          = $repository->createQueryBuilder('o');

    $totalCount = (int) $qb->select($qb->expr()->count('o'))
        ->where($qb->expr()->eq('o.amountOut', 0))
        ->getQuery()
        ->getSingleScalarResult();
    $progressBar = $io->createProgressBar($totalCount);

    $query       = $qb->select('o')
        ->where($qb->expr()->eq('o.amountOut', 0))
        ->getQuery();
    $iterableResult = $query->iterate();

    $batchSize = 100;
    $i         = 0;

    foreach ($iterableResult as $row) {
        /** @var Order $order */
        $order          = $row[0];
        $commissionsArr = $this->calcCommissionInOutFromOrder($order);
        $amountOut      = $order->getTransferAmount();

        $order->setAmountOut($amountOut);
        $order->setCommissionIn($commissionsArr['commission_in']);
        $order->setCommissionOut($commissionsArr['commission_out']);
        $em->persist($order);

        $progressBar->advance();

        if (0 === ($i % $batchSize)) {
            $em->flush();
            $em->clear();
        }

        ++$i;
    }
    $em->flush();

    $io->success('Suckess');
}
在中找到了实际答案

引用:“我通过在我的命令中添加--no debug解决了这个问题。事实证明,在调试模式下,探查器在内存中存储关于每个查询的信息。”

它确实起作用了。使用内存获取用法()我已经检查过了