Doctrine2批量更新失败,导致致命的内存错误。麻烦“订购”?

时间:2012-11-29 15:27:23

标签: symfony batch-file doctrine-orm

我尝试按照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中的一个人提到一对一的关系(自我引用)可能是个问题?但删除这种关系并没有解决它。

问题: 我怎么能管它呢?我只需要更新表格中最旧的条目。

1 个答案:

答案 0 :(得分:0)

哦,伙计,我查看了/app/logs/dev.log并执行了语句sql。 我发现的是第一行中的一些中国标志(在名称栏中)。

我删除了条目,现在脚本继续工作......似乎是charset的一个问题。该表是utf8 ...我想知道我必须在数据库连接中更改此charset?