我在基于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释放结果,从而释放它使用的内存?或者你怀疑另一个原因?
答案 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数组(以及一般值)的内存使用情况,它会创建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 - 比我们估计的多八十倍。