PHP脚本的内存不足问题

时间:2014-02-26 18:03:02

标签: php

我的PHP脚本内存不足。我把memory_get_usage()放在循环中,发现它在6MB后耗尽内存 我想清楚地解释一下我的剧本,并希望得到你的建议。 我不确定,如果我的脚本由于代码问题而耗尽内存 所以,这是我的脚本的算法:

  1. 将输入的json数据读入一个数组(大约200行数据)
  2. 计算数组的总和($ sum)
  3. 3个变量$ starting,$ ending和$ compare。(初始化$ compare = $ starting)
  4. 以$ starting = $ vmin开始,计算比例因子,缩放原始数组并计算它的总和。这个新的总和是$结尾。
  5. 将$ 10添加到$,直到$ ending和$ compare之间的差异为50.
  6. 重复所有步骤,直到$ vmin达到$ vmax且增量为$ vinc
  7. 上述算法可能看起来很疯狂,但它找到了供应链相关优化问题的最优解决方案。 我希望您看看我的弱编码功能是否是内存中断的原因。如果是这样,请建议我的脚本更改。 这是我的代码

    $vmax = 10000;
    $vmin = 1000;
    $vinc = 2000;
    
    //decode the json data                                             
    $fp = fopen("data_save3.json", "r");
    $inp=file_get_contents("data_save3.json");
    fclose($fp);
    $inp=json_decode($inp);
    
    //calculate the array sum          
    foreach($inp as $i=>$element) {
        foreach($element as $j=>$sub_element) {       
            $sum+= $inp[$i][$j];
        } 
    }    
    //start at vmin and increment it until vmax
    for(;$vmin <=$vmax;) {
        $starting=$vmin;
        $compare = $starting;
        //calculate scaling factor
        $scale = $starting/$sum; 
        //calculate the scaled array  
        $sum2 = 0;
        $inp_info2 = $inp;    
        $ending = newscale($inp_info2,$scale,$sum2);
        $optimal = getClosest($starting,$ending,$compare,$sum);
        echo $optimal.PHP_EOL;  
        $vmin = $vmin+$vinc ;
    }
    // function to find the closest value
    $inp_info1=$inp;
    function getClosest($starting,$compare,$ending,$sum,$inp) {
        global $sum2;
        global $compare;
        global $inp_info1;
        global $starting , $ending, $scale1, $sum, $inp, $inp_info2, $inp_info3,$rowsum2,    $rowsum3, $rowsum4, $rowsum5;
        if (abs($ending - $compare) < 50){
            return $starting;
        } else{    
            $starting = $starting +10;  
            $scale1 = $starting/$sum;
            $inp_info1 = $inp; 
            $sum2 = 0;      
            $ending = newscale($inp_info1,$scale1,$sum2); 
            return getClosest($starting);
        }
    }
    //array scaling function        
    function newscale($array,$scale,$sum2){
    global $sum2,$scale;
    foreach($array as $i=>$element) {
        foreach($element as $j=>$sub_element) {         
            $array[$i][$j]*= $scale;   
            $array[$i][$j] = truncate($array[$i][$j]);
            $sum2+=$array[$i][$j];
        }     
    }
    return $sum2;
    }    
    //truncate function
    function truncate($num, $digits = 0) {
        $shift = pow(10, $digits);
        return ((floor($num * $shift)) / $shift);
    }
    

0 个答案:

没有答案