如何在PHP中释放内存或改进PHPExcel?

时间:2015-12-08 14:26:10

标签: php algorithm memory garbage-collection phpexcel

PHPExcel需要太多内存才能加载文件。我希望通过内存使用来改进这段代码。

此代码错误Fatal error: Allowed memory size of 536870912 bytes exhausted

/* class PHPExcel_Cell 
 *
 * $returnValue = array()
 * 
*/

$sortKeys = array();

foreach (array_unique($returnValue) as $coord) {
    sscanf($coord,'%[A-Z]%d', $column, $row);
        $sortKeys[sprintf('%3s%09d',$column,$row)] = $coord;
}

ksort($sortKeys);

return array_values($sortKeys);
  

$ returnValue = array(“B1”,“C12”,“C1”,“D3”,“B2”......)   
必须按数组排序(“B1”,“B2”,“C1”,“C12”)

第一个问题:如果我理解正确, array_unique 使用一个额外的数组来存储结果,因此总内存使用量 x2 (如果我们有具有独特元素的数组)。但我认为不需要使用array_unique,因为任何重复都将用这一行重写:

$sortKeys[sprintf('%3s%09d',$column,$row)] = $coord;

第二个问题:这段代码使用两个数组:$ returnValue和$ sortKeys(2x memory),所以我把它重写为:

$len = count($returnValue);

for ($i = 0; $i < $len; $i++) {

    $val = $returnValue[$i];
    unset($returnValue[$i]);

    sscanf($val,'%[A-Z]%d', $column, $row);
    $returnValue[sprintf('%3s%09d',$column,$row)] = $val;

}

ksort($returnValue);

return array_values($returnValue);

但是 unset()不会释放内存,只会从数组中删除元素而 gc_collect_cycles()也无效。

如何在取消设置后释放内存? 也许你知道其他方式,如何通过内存使用来改进这段代码?

P.S。我不能使用 xlsx2csv 和其他bash工具。

2 个答案:

答案 0 :(得分:0)

您的代码看起来很奇怪,您从数组中删除元素,然后在一个循环中添加一个新元素。 当我使用PHPExcel时,我使用了析构函数来释放内存并且它运行良好

function __destruct()
    {
        if ($this->phpExcelObj) {
            \PHPExcel_Calculation::unsetInstance($this->phpExcelObj);
            if ($this->phpExcelObj) {
                $this->phpExcelObj->disconnectWorksheets();
                unset($this->phpExcelObj);
            }
        }
    }

另一种方法是使用Word制作模板并使用PHPExcel加载该模板,然后您将避免使用内存消耗操作来制作文档的标记。 这些技术帮助我使用PHPExcel加载了数百万行而没有那么多内存。

答案 1 :(得分:0)

我不确定是否有帮助,但是您可以尝试以下方法:

$spreadsheet->disconnectWorksheets();
unset($spreadsheet);

来自:https://phpspreadsheet.readthedocs.io/en/latest/topics/creating-spreadsheet/#clearing-a-workbook-from-memory