【问题标题】:Caching large Array causes memory exhaustion缓存大数组会导致内存耗尽
【发布时间】:2014-10-17 05:11:49
【问题描述】:

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

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吗?我已经覆盖了内存限制并将其设置为 -1 在某处.php

【问题讨论】:

  • 您的服务器上有多少内存可用?
  • 我如何识别它?很遥远
  • 首先尝试phpinfo() 检查memory_limit 是否已被覆盖。告诉我您使用的是 Linux 还是 Windows?

标签: php caching file-upload multidimensional-array


【解决方案1】:

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

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

检查 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 函数释放占用的内存时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2012-12-09
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    相关资源
    最近更新 更多