我试图通过以下方式编写一个批量更新片段http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html#iterating-结果
我使用框架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个内存大小运行此代码,我会得到以下错误:允许的内存大小为268435456字节,已用尽(试图分配72字节),位于第230行的/symfony2_installation/vendor/domeric/orm/lib/doctrine/orm/Internal/Hydration/ArrayHydrator.php中
如果我用512内存大小运行此代码,我会在空白屏幕上得到此错误:324(net::ERR_EMPTY_REPONSE)
事实证明,通过在我的SQL中删除"按a.touch ASC排序",它一次可以很好地处理2000多个条目。
#学说中的一个人提到,一对一的关系(自我参照)可能是个问题?但消除这种关系并不能解决问题
问题:我该怎么办?我只需要更新表中最旧的条目。
天哪,我查看了/app/logs/dev.log并执行了sql语句。我在第一排(名字栏)发现了一些中文标志。
我删除了条目,现在脚本继续工作。。。似乎是字符集的问题。表是utf8…我想知道在数据库连接中,我必须在哪里更改这个字符集?