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

标签 php memory-management memory-leaks recursion

我有一个递归函数来迭代超过 11M 的数据库记录,一次 1000 条。当接近9M时它停了下来。当我每 1000 条记录后显示 get_memory_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。

最佳答案

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

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

while (!$done) {
  $id = get_data_block($id);
  $done = // determine if finished or not
}

即从 get_data_block 返回 $id,如果不需要进行更多处理,则为其提供无效值。您不必担心堆栈帧以这种方式堆积。

关于php - 深度递归内存泄漏 - 取消设置 fopen 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278320/

相关文章:

c++ - 有没有一种方法可以在不修改基类的情况下防止派生类中的内存泄漏?

java - 在 Java 中导致内存泄漏的最简单方法

php - ZendFramework 与其他框架的集成

php - 格式化 $wpdb->get_results

javascript - 如何仅在 html onload(刷新)(无点击)上从另一个 php 页面调用 php 函数

iphone - NSCFString 内存泄漏

objective-c - 使用分配和初始化

objective-c - 我是否必须保留/释放从 NSDictionary 获取的值?

c - C 中的内存泄漏是什么?

php - 使用 imagick 驱动程序调整为小图像的图像会产生大文件大小