我有递归函数:
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: 我发现变量备忘录需要cca 307MB
EDIT3: 我重写了算法,所以我根本不需要记忆......
答案 0 :(得分:0)
PHP的数组远离经典数组。它是一个实现链表和哈希表的数据结构。有很多开销在内存消耗中明显反映出来。我不知道没有关于它们的实现细节,但事实上它只有1900000 *(10字节索引+4字节值)吃300MB意味着你不能在PHP中拥有大型数组。
我刚刚了解到,PHP提供了对经典数组的访问,这种数据消耗的内存要少得多。 PHP称之为SplFixedArray
。但这对你没有帮助,因为你需要哈希映射的功能。