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工具。
答案 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);