Php 学说与大量数据

Php 学说与大量数据,php,doctrine,Php,Doctrine,我有一个查询,返回约50k行, 似乎条令将整个结果存入内存,超过了内存限制(128M) 我找到的唯一节省内存的解决方案是 $result->execute(array(), Doctrine_Core::HYDRATE_NONE); 但还是超出了限度,, 有没有办法用条令一次读一行 更新: 有关1.2,请查看本页: 在“按需”标题下,您将找到答案。是否有不使用->限制()和->偏移()的原因?批处理有帮助 我花了很长时间才弄明白什么是有用的。我的印象是,只要您停留在同一个php进程中

我有一个查询,返回约50k行, 似乎条令将整个结果存入内存,超过了内存限制(128M) 我找到的唯一节省内存的解决方案是

$result->execute(array(), Doctrine_Core::HYDRATE_NONE);
但还是超出了限度,, 有没有办法用条令一次读一行

更新: 有关1.2,请查看本页:


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

是否有不使用->限制()和->偏移()的原因?

批处理有帮助

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

  • $object->free(真)
  • 未设置($对象)
  • sfConfig::set('sf_debug',false)
  • gc_collect_cycles()/gc_enable()
  • 核心原则:按需水合
  • sfCommandApplicationTask::runTask()
  • sfDoctrinePager
真正有帮助的是谁建议生成子流程来执行部分工作。查询的限制和偏移量作为进程之间的参数给出。要逐行获取,请将$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
    );
 }
$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.' );
}
(我正在PHP5.3.10上的Symfony1.4框架中使用Doctrine 1.2)


对这个话题的任何评论或批评都是非常感谢的,因为这对我来说是一个困难的话题

第一个问题是-您真的需要一次查询所有这些行吗?你想达到什么目标?也许这些计算可以在查询中实现?如果只是为了显示,那么你就可以真正实现分页了。这是为了让xml Feed1.2版而不是2.0版我想它的1.2版有什么解决方案吗?不幸的是,对我来说,这些技巧没有实质性的帮助。它真的解决了你的问题吗?我在下面概述了另一种方法。Cheeset仍将使用大量内存,并且需要更多时间。下一步我要把这个结果写入一个文件