循环中的内存释放PDO语句

时间:2013-03-28 10:37:19

标签: php zend-framework zend-db

我在基于ZF1的应用程序中使用以下代码:

$select = $db->select()->from('table', array('id', 'int', 'float'))->limit(10000, (($i - 1) * 10000));
$data = $select->query();
while ($row = $data->fetch()) {
     # ...
}

此操作在foreach循环中发生了大约800次。我输出每次传递的内存使用量,并且可以看到它每次传递增加大约5MB。我想这是因为一旦传递完成,Zend显然不会从查询中释放结果。一个简单的未设置并没有解决问题。使用fetchAll也没有改善(或改变)这种情况。

有没有办法从Zend_Db_Statement_PDO释放结果,从而释放它使用的内存?或者你怀疑另一个原因?

2 个答案:

答案 0 :(得分:0)

我相信你想这样做:

$sql = "SELECT something FROM random-table-with-an-obscene-large-amount-of-entries";
$res = $db->query($sql);

while ($row = $res->fetch(Zend_Db::FETCH_NUM)) {
  // do some with the data returned in $row
}

Zend_Db :: FETCH_NUM - 返回数组数组中的数据。数组由整数索引,对应于查询的选择列表中相应字段的位置。

由于您在每个循环上覆盖$ row,因此应回收内存。如果你是偏执狂,你可以在循环的底部取消设置($ row)我相信。我最近自己没有对此进行过测试,但是大约一年前我遇到了类似的批处理问题,我似乎记得使用这个解决方案。

答案 1 :(得分:0)

实际上问题隐藏在其他地方:

  • 在循环内部,一些整数结果存储在一个数组中,以便在工作流程的后续计划阶段进行修改。
  • 虽然人们可能认为PHP数组很小,但事实并非如此:Arrays grow big really fast和PHP数组的平均值是“预期”的18倍。使用数组时要小心,即使你只存储整数!

如果链接文章有时会消失:

  

在这篇文章中,我想使用以下脚本作为示例来研究PHP数组(以及一般值)的内存使用情况,它会创建100000个唯一的整数数组元素并测量产生的内存使用情况:

$startMemory = memory_get_usage();
$array = range(1, 100000);
echo memory_get_usage() - $startMemory, ' bytes';
     

您期望它多少钱?简单,一个整数是8个字节(在64位unix机器上并使用long类型),你有100000个整数,所以你显然需要800000字节。这就像0.76 MB。

     

现在尝试运行上面的代码。这给了我14649024字节。是的,你听到的是,这是13.97 MB - 比我们估计的多八十倍。