在递归函数中释放内存的方法?

时间:2010-09-08 19:58:41

标签: php

这个递归函数使用超过1.4 MB的RAM,并且它没有被释放。它返回的只是一个int。我怎样才能释放更多的记忆?

function bottomUpTree($item, $depth)
{
   if ($depth)
   {
      --$depth;
      $newItem = $item << 1;
      return array(
         bottomUpTree($newItem - 1, $depth),
         bottomUpTree($newItem, $depth),
         $item
      );
   }
   unset($depth);
   unset($newItem);
   return array(NULL, NULL, $item);
}

bottomUpTree(0, 7);

2 个答案:

答案 0 :(得分:3)

递归函数总是会占用内存。每次通话都会消耗掉一些,直到你到达底部并开始返回。这是不可避免的。对函数的参数执行unset()对你没有帮助......它们已经占用了调用堆栈上的空间,并且在函数返回之前无法删除。

一种选择是切换到迭代函数,但这对树结构来说更难。

但最重要的是,这个功能实际上完成了什么?你正在返回数组,但没有将它们分配到调用级别的任何地方,所以你创建了大量数组只是为了立即将它们丢弃。

答案 1 :(得分:0)

让php编译器释放内存的一些技巧是执行以下操作:

  1. 将递归函数的内存密集部分提取到它自己的函数/方法中。在函数完成/退出/返回之前,PHP不会释放内存。
  2. 在提取的函数/方法中返回之前,将变量设置为NULL。
  3. 调用内存密集型函数后调用gc_collect_cycles()。