1

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

问题: 我该如何管理它?我只需要更新表中最旧的条目。

4

1 回答 1

0

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

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

于 2012-11-29T16:09:26.933 回答