Doctrine orm 条令2大批量更新
我正在使用Symfony 3.4和Doctrine。 我需要使用条令更新大量实体(300k+)。 我读过《条令文档》中的批处理文章,也读过堆栈中的主题,但问题是,尽管批处理的大小(20100200500)很大,但当我接近20k个已处理实体时,还是会出现“内存不足”错误 这是我的功能 有人能给我一个如何避免这种情况的提示/建议吗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 {
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解决了这个问题。事实证明,在调试模式下,探查器在内存中存储关于每个查询的信息。”
它确实起作用了。使用内存获取用法()我已经检查过了