我尝试按照http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html#iterating-results
编写批量更新代码段我使用框架symfony2,我尝试迭代大约一百万行,用gedmo doctrine2扩展来更新我的'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中允许的内存大小为268435456字节耗尽(试图分配72个字节)第230行/Doctrine/ORM/Internal/Hydration/ArrayHydrator.php
如果我以512内存大小运行此代码,我会在空白屏幕上显示此错误:324(net :: ERR_EMPTY_RESPONSE)
事实证明,通过在我的SQL中删除“按a.touch ASC排序”,它可以同时处理超过2000个条目。
#doctrine中的一个人提到一对一的关系(自我引用)可能是个问题?但删除这种关系并没有解决它。
问题: 我怎么能管它呢?我只需要更新表格中最旧的条目。
答案 0 :(得分:0)
哦,伙计,我查看了/app/logs/dev.log并执行了语句sql。 我发现的是第一行中的一些中国标志(在名称栏中)。
我删除了条目,现在脚本继续工作......似乎是charset的一个问题。该表是utf8 ...我想知道我必须在数据库连接中更改此charset?