【发布时间】:2016-03-13 12:28:45
【问题描述】:
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 内存),所以我改写成这样:
$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() 也不起作用。
取消设置后如何释放内存?
也许您知道其他方式,如何通过内存使用来改进此代码?
附:我无法使用 xlsx2csv 和其他 bash 工具。
【问题讨论】:
-
您可以尝试使用 Spout (github.com/box/spout)。它的功能比 PHPExcel 少,但在性能和内存使用方面非常出色(您不需要超过 10MB!)。
-
@Adrien -
How to improve PHPExcel并不意味着how to switch to an alternative....运行 PHP -
我提到 Spout 是因为最初的问题已经提到了替代品 (xlsx2csv),所以我认为它是合适的。我在这里理解问题的方式不是关于如何改进 PHPExcel 的 gc,而是更多关于如何完成我的工作。如果您认为我的评论不合适,请随时删除我的评论,并请接受我的道歉:)
标签: php algorithm memory garbage-collection phpexcel