【问题标题】:doctrine and large amount of data学说和大量数据
【发布时间】:2011-08-23 22:56:42
【问题描述】:

我有一个返回约 50k 行的查询, 似乎学说将整个结果放入内存中超出内存限制(128M) 我发现的唯一可以节省一些内存的解决方案是

$result->execute(array(), Doctrine_Core::HYDRATE_NONE);

但仍然超出限制, 有没有什么方法可以一次读一行的教义?

【问题讨论】:

  • 您的第一个问题是——您真的需要查询所有这些行一次吗?你想达到什么目的?也许这些计算可以在查询中实现?而如果只是为了展示,那么你真的可以实现分页。
  • 这是制作xml提要

标签: php doctrine


【解决方案1】:

Doctrine Documentation - 13. Batch Processing

更新: 对于 1.2,请查看此页面: http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/data-hydrators.html

在“按需”标题下,您会找到答案。

【讨论】:

  • 我猜它的版本是 1.2 而不是 2.0
  • 学说1.2有解决办法吗?
  • 不幸的是,这些技巧对我来说并没有太大帮助。它真的解决了你的问题吗?我在下面概述了另一种方法。干杯
【解决方案2】:

批处理有帮助!

我花了很长时间才弄清楚有什么帮助。我的印象是,只要你停留在同一个 php 进程中,你就无法释放你的内存。所以这对我没有帮助

  • $object->免费(真)
  • 未设置($object)
  • sfConfig::set('sf_debug', false)
  • gc_collect_cycles() / gc_enable()
  • Doctrine_Core::HYDRATE_ON_DEMAND
  • sfCommandApplicationTask::runTask()
  • sfDoctrinePager

真正有帮助的a hint from Rich Sage,他建议生成子流程来执行部分工作。查询的 Limit 和 Offset 作为进程之间的参数给出。要逐行设置 $options['limit'] 为 1,但 50 也应该是一个不错的值:

daddyTask.class.php

[..]
$total = ItemTable::getInstance()->createQuery('i')->count();

for ($offset = 0; $offset < $total; $offset += $options['limit'] )
{
    passthru(
        sprintf('%s %s/symfony doTask --limit=%s --offset=%s', sfToolkit::getPhpCli(), sfConfig::get('sf_root_dir'), $options["limit"], $offset),
        $returnVar
    );
 }

doTask.class.php

$items = ItemTable::getInstance()->createQuery('i')->limit($options['limit'])->offset($options['offset'])->execute();

foreach( $items as $item )
{
    // ..do something with the item
    $this->log( 'INFO: '.memory_get_peak_usage(true).' memory in use.' );
}

(我在 PHP 5.3.10 上的 Symfony 1.4 框架中使用 Doctrine 1.2)

非常感谢对此主题的任何 cmet 或批评,因为这对我来说很难!

【讨论】:

    【解决方案3】:

    你不使用 ->limit() 和 ->offset() 有什么原因吗?

    【讨论】:

    • 它仍然会使用大量内存,并且会花费更多时间。我正在将这个结果写入文件
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多