【发布时间】:2014-03-02 22:00:51
【问题描述】:
我有递归函数:
function find($index, &$itemsCounts, &$amountsSums, $deep)
在这个函数中我再次调用它:
find($index, &$itemsCounts, &$amountsSums, $deep+1)
最大深度为 182,分配内存的峰值为 751MB...我不明白在那个递归调用中是什么占用了这么多内存...
谁能解释一下?有人知道在堆栈上存储一个调用需要多少内存吗? 谢谢
编辑: 函数看起来像:
private function findChod($index, &$itemsCounts, &$amountsSums, $deep){
if($amountsSums['a'] > $this->upperLimit) return;
$check_string = "";
if($deep > $this->maxDeep) $this->maxDeep = $deep;
foreach ($this->x[$index]['a'] as $key => $item) {
$check_string = $check_string." ".$itemsCounts[$key];
}
if(isset($this->memo[$check_string]))
return;
$this->memo[$check_string] = 1;
$a = "asda;"
$b = "asda;"
$c = "asda;"
$d = "asda;"
$e = "asda;"
$f = "asda;"
if() return;
if(){
if(){
$this->compareWithBest($amountsSums, $itemsCounts, abs($fatsDifference)+abs($protsDifference)+abs($carbsDifference));
}
}
unset($a);
unset($b);
unset($c);
unset($d);
unset($e);
unset($f);
foreach ($this->x[$index]['items'] as $key => $item) {
$amountsSums['a'] += $item['a'] * $item['unit'];
$amountsSums['b'] += $item['b'] * $item['unit'] ;
$amountsSums['c'] += $item['c'] * $item['unit'];
$amountsSums['d'] += $item['d'] * $item['unit'];
$itemsCounts[$key]++;
$this->find($index, $itemsCounts, $amountsSums, $deep+1);
$amountsSums['a'] -= $item['a'] * $item['unit'];
$amountsSums['b'] -= $item['b'] * $item['unit'];
$amountsSums['c'] -= $item['c'] * $item['unit'];
$amountsSums['d'] -= $item['d'] * $item['unit'];
$itemsCounts[$key]--;
}
}
备忘录的峰值为 1 900 000 项... 我正在使用 php 5.5.3
EDIT2: 我发现变量 memo 需要 cca 307MB
EDIT3: 我重写了我的算法,所以我根本不需要内存......
【问题讨论】:
-
你能显示
find($args,...)函数的内容吗?顺便问一下你的 PHP 版本是什么。 -
这很大程度上取决于
find函数在每次调用时在做什么。 -
除非您使用旧的 PHP4 调用时间,否则不推荐使用按引用传递。您使用
find($index, $itemsCounts, $amountsSums, $deep+1)进行递归。这并不能解释您的内存使用情况,因此您应该编辑问题并添加find的完整定义。 -
是的,但我没有使用按引用传递的调用时间...我仍然不明白这里是什么占用了这么多内存...
-
unset($check_string)(在递归调用之前)有帮助吗?$itemsCounts也可能变大。嗯,您必须进行调试并查看内存使用情况。我不确定 PHP 是否可以做到这一点。 xdebug 可能会有所帮助。
标签: php memory-management recursion