我正在使用PHPExcel (在这里可以找到:https://github.com/PHPOffice/PHPExcel)。如果我尝试读取大约2000行,那么它将显示内存错误如下。
致命错误:第89行/home/sample/PHPExcelReader/Classes/PHPExcel/worksheet.php中允许内存耗尽134217728字节(尝试分配71个字节)
我的Excel数据范围是A1:X 2000
下面的是我用来读取excel.的代码。
ini_set('memory_limit', '-1');
/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . 'Classes/');
/** PHPExcel_IOFactory */
include $unsecured_param['home_dir'].'APIs/PHPExcelReader/Classes/PHPExcel/IOFactory.php';
$inputFileName = $target; // File to read
//echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory to identify the format<br />';
try {
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);
} catch(Exception $e) {
die('Error loading file "'.pathinfo($inputFileName,PATHINFO_BASENAME).'": '.$e->getMessage());
}
$sheetData = $objPHPExcel->getActiveSheet()->rangeToArray('A1:X2000', null, true, true, true)
//store data into array..
$i=0;$j=0;$max_rows=0;$max_columns=0;
foreach($sheetData as $rec)
{
foreach($rec as $part)
{//echo "items[$j][$i]=" ; echo $part;echo "<br>";
$items[$j][$i]=$part; $i=$i+1;
if($j==0) {$max_columns=$i;}
}
$j=$j+1;$i=0;
}
$max_rows=$j;有谁能告诉我如何克服这个问题吗?
发布于 2014-02-19 21:41:47
考虑使用单元缓存来减少在内存中保存工作簿所需的内存,如开发人员文档第4.2.1节所述
并考虑使用而不是使用toArray(),然后使用它在内存中构建另一个数组.这样做实际上是使用大量内存来保存重复的数据,这时您可以简单地遍历工作表的行和列来完成所需的工作。
发布于 2014-02-19 20:12:46
此错误意味着正在运行的PHP文件超出了服务器上PHP内存中允许的大小。您可以编辑您的PHP.ini文件,允许它们在运行时在内存中分配更多的空间,这可能有助于这一点,但同时,如果您正在服务器上运行32位Linux操作系统,则进程可以占用3.5GB的硬角,所以即使分配更多的空间,它仍然会失败,因此也会引发类似的问题。
在这种情况下,这真的可以归结为这样一个事实:您想要提取的数据量太大了,您需要以某种方式将其缩小。这不一定是代码的问题,而是实际要显示/处理多少数据。
使用google,我设法发现您注意到的内存量(134217728字节)与PHP.ini用于memory_limit的128 of默认值相匹配。本机更改ini中的值将解决此问题。如果无法做到这一点,那么您需要以某种方式限制一次输入的数据量。
信息:http://ca1.php.net/manual/en/ini.core.php#ini.memory-limit
https://stackoverflow.com/questions/21891248
复制相似问题