缓存大型数组会导致内存耗尽

时间:2014-10-17 05:11:49

标签: php caching file-upload multidimensional-array

所以我试图在一个文件中缓存一个数组并在其他地方使用它。

import.php

// Above code is to get each line in CSV and put in it in an array 
// (1 line is 1 multidimensional array) - $csv 

$export = var_export($csv, true);
$content = "<?php \$data=" . $export . ";?>";
$target_path1 = "/var/www/html/Samples/test";

file_put_contents($target_path1 . "recordset.php", $content); 

somewhere.php

ini_set('memory_limit','-1');
include_once("/var/www/html/Samples/test/recordset.php");
print_r($data);

现在,我已经在somewhere.php中包含了recordset.php来使用存储在其中的数组。当上传的CSV文件有5000行时,它可以正常工作,现在如果我尝试使用50000行上传csv,我会收到致命错误:

  

致命错误:允许的内存大小为67108864字节(尝试分配79691776字节)

我该如何修复它,或者是否有可能以更方便的方式实现我想要的东西?谈到性能......我应该考虑服务器的CPU吗?我已经覆盖内存限制并在somewhere.php中将其设置为-1

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题:

  1. 您需要增加服务器上的内存(RAM),因为memory_limit只能使用服务器上可用的内存。而且似乎你的PHP可用内存非常低。
  2. 检查Linux服务器上的总RAM:

    <?php
      $fh = fopen('/proc/meminfo','r');
      $mem = 0;
      while ($line = fgets($fh)) {
        $pieces = array();
        if (preg_match('/^MemTotal:\s+(\d+)\skB$/', $line, $pieces)) {
          $mem = $pieces[1];
          break;
        }
      }
      fclose($fh);
    
      echo "$mem kB RAM found"; ?>
    

    来源: get server ram with php

    1. 您应该以块和&解析您的CSV文件每次使用unset函数释放占用的内存。