【问题标题】:Doctrine 2 update large batch教义2更新大批量
【发布时间】:2019-02-12 23:25:07
【问题描述】:

我正在使用 Symfony 3.4 和 Doctrine。 我需要使用 Doctrine 更新大量实体(300k+)。 我已经阅读了 Doctrine 文档中的批处理文章,并且我已经从堆栈中阅读了主题,但问题是尽管批处理的大小(20、100、200、500)当我在接近 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');
}

【问题讨论】:

    标签: doctrine-orm symfony-3.4


    【解决方案1】:

    Memory leak when executing Doctrine query in loop找到实际答案。

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

    它确实有效。使用 memory_get_usage() 我已经检查过了。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2023-03-03
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2013-05-26
      相关资源
      最近更新 更多