首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPExcel抛出致命错误:允许内存大小为134217728字节(尝试分配71个字节)

PHPExcel抛出致命错误:允许内存大小为134217728字节(尝试分配71个字节)
EN

Stack Overflow用户
提问于 2014-02-19 20:06:43
回答 2查看 9.2K关注 0票数 2

我正在使用PHPExcel (在这里可以找到:https://github.com/PHPOffice/PHPExcel)。如果我尝试读取大约2000行,那么它将显示内存错误如下。

致命错误:第89行/home/sample/PHPExcelReader/Classes/PHPExcel/worksheet.php中允许内存耗尽134217728字节(尝试分配71个字节)

我的Excel数据范围是A1:X 2000

下面的是我用来读取excel.的代码。

代码语言:javascript
复制
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;

有谁能告诉我如何克服这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2014-02-19 21:41:47

考虑使用单元缓存来减少在内存中保存工作簿所需的内存,如开发人员文档第4.2.1节所述

并考虑使用而不是使用toArray(),然后使用它在内存中构建另一个数组.这样做实际上是使用大量内存来保存重复的数据,这时您可以简单地遍历工作表的行和列来完成所需的工作。

票数 1
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21891248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档