调用递归函数PHP的内存成本是多少

时间:2014-03-02 22:00:51

标签: php memory-management recursion

我有递归函数:

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: 我重写了算法,所以我根本不需要记忆......

1 个答案:

答案 0 :(得分:0)

PHP的数组远离经典数组。它是一个实现链表和哈希表的数据结构。有很多开销在内存消耗中明显反映出来。我不知道没有关于它们的实现细节,但事实上它只有1900000 *(10字节索引+4字节值)吃300MB意味着你不能在PHP中拥有大型数组。

我刚刚了解到,PHP提供了对经典数组的访问,这种数据消耗的内存要少得多。 PHP称之为SplFixedArray。但这对你没有帮助,因为你需要哈希映射的功能。