Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 深度递归内存泄漏-是否取消设置fopen资源?_Php_Memory Management_Memory Leaks_Recursion - Fatal编程技术网

Php 深度递归内存泄漏-是否取消设置fopen资源?

Php 深度递归内存泄漏-是否取消设置fopen资源?,php,memory-management,memory-leaks,recursion,Php,Memory Management,Memory Leaks,Recursion,我有一个递归函数来迭代11M个数据库记录,每次迭代1000个。当它接近9米时,它停了下来。当我在每1000条记录后显示get\u memory\u usage()时,我对内存问题的假设得到了证实 该函数的工作原理如下: <? get_data_block(); function get_data_block($id=0); { //open a csv file for writing $packages_sorted_csv=fopen("./csv/packages_

我有一个递归函数来迭代11M个数据库记录,每次迭代1000个。当它接近9米时,它停了下来。当我在每1000条记录后显示
get\u memory\u usage()
时,我对内存问题的假设得到了证实

该函数的工作原理如下:

<?
get_data_block();

function get_data_block($id=0);
{
    //open a csv file for writing
    $packages_sorted_csv=fopen("./csv/packages_sorted.csv", "a");

    //get 1000 records and process them
    //$unsorted = array of 1000 records from database
    foreach($unsorted as $row);
    {
        $ct++;
        $id++;
        //$packages_sorted = array of processed data

        //write output
        fputcsv($packages_sorted_csv, $packages_sorted);
    }
    fclose($packages_sorted_csv);

    if($ct==1000)
    {
        unset($unsorted);
        echo 'Mem usage: '.memory_get_usage();
        get_data_block($id);    //call the function again
    }else{
        //finished
    }
}

?>

有人知道如何使用递归函数释放所有资源吗? …还是有办法再次调用同一个函数,使其不被自身调用

注:

  • 我必须将数据分块以释放繁忙的mysql服务器
  • 我已尝试取消设置所有不在全局范围内的已定义变量
  • 我唯一无法解决的是fopen资源
  • 每次迭代内存大小都会增加大约400k

从您发布的代码来看,递归似乎不是正确的方法

构建第二个函数并重新排列该函数,以便可以执行以下操作(伪代码):


i、 e.从
get_data_block
返回
$id
,如果不需要进行更多处理,则返回一个无效值。您不必担心堆栈帧以这种方式堆积。

一种好的编程语言应该识别尾部递归并将其转换为隐式循环


PHP显然没有,所以在某个时候你会得到一个堆栈溢出。试着重写代码,改用循环,或者用处理队列进行迭代。

我觉得自己太笨了。非常感谢。有时我只是看不见树木,看不见森林。
while (!$done) {
  $id = get_data_block($id);
  $done = // determine if finished or not
}