我尝试按照http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html#iterating-results编写批量更新片段
我使用框架 symfony2 并尝试迭代大约一百万行以使用 gedmo 学说 2 扩展更新我的“slug”列。
我最终得到的代码:
$this->container->get('profiler')->disable(); // should disable logging and profiler
$batchSize = 20;
$i = 0;
$q = $em->createQuery('select a from ACMEArtistBundle:Artist a order by a.touch ASC')
->setMaxResults(40); // a.touch is a DateTime Column
$q->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true); // some tipp i read somewhere
$iterableResult = $q->iterate();
while (($row = $iterableResult->next()) !== false) {
$row[0]->setSlug('');
if (($i % $batchSize) == 0) {
$em->flush(); // Executes all deletions.
$em->clear(); // Detaches all objects from Doctrine!
}
++$i;
}
如果我以 256 内存大小运行此代码,我会收到此错误:/symfony2_installation/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ArrayHydrator 中允许的内存大小为 268435456 字节已用尽(尝试分配 72 字节) .php 在第 230 行
如果我以 512 内存大小运行此代码,则会出现此错误并出现空白屏幕:324 (net::ERR_EMPTY_RESPONSE)
事实证明,通过在我的 SQL 中删除“order by a.touch ASC”,它一次可以很好地处理 2000 多个条目。
#doctrine 中的一个人提到一对一的关系(自我引用)可能是一个问题?但删除这种关系并没有解决它。
问题: 我该如何管理它?我只需要更新表中最旧的条目。