【发布时间】:2019-05-16 18:27:35
【问题描述】:
在我的脚本中,我想清除数组元素以从不再使用的数据中释放内存。
我发现自己处于使用 unset() 导致的奇怪情况:
( ! ) 致命错误:允许的内存大小为 134217728 字节已用尽 (试图分配 16777224 字节)在 .../models/Persons.php 第 60 行
这是导致此问题的代码部分:
$chunks_count = count($this->xml_records_chunk['fnames']) - 1;
for ($num = 0; $num <= $chunks_count; $num++) {
$chunks_count = count($this->xml_records_chunk['fnames']) - 1;
$not_last = ($num < $chunks_count ? ',' : '');
$new_records .= '(' . $this->xml_records_chunk['fnames'][$chunks_count] . ','
. $this->xml_records_chunk['lnames'][$chunks_count] . ' , '
. $this->xml_records_chunk['dobs'][$chunks_count] . ' , '
. $this->xml_records_chunk['phones'][$chunks_count] . ' )' . $not_last;
unset($this->xml_records_chunk['fnames'][$chunks_count]);
unset($this->xml_records_chunk['lnames'][$chunks_count]);
unset($this->xml_records_chunk['dobs'][$chunks_count]);
unset($this->xml_records_chunk['phones'][$chunks_count]);
}
脚本可以正常工作而无需取消设置。
现在的问题是:
- 为什么未设置会导致内存耗尽?
- 在这种情况下,取消设置未使用的数组元素的正确方法是什么?
我已经检查过这个例子:
Ok null 确实以其他方式工作,因为脚本在第 61 行 - 第 3 行未设置时死亡。
【问题讨论】:
-
$this->xml_records_chunk['fnames']是数组还是实现类数组方法的对象? -
您可能希望使用XMLReader 或XML Parser 来处理XML,而不是将整个文件加载到内存中。
-
我正在使用 XMLReader。
$this->xml_records_chunk是一个数组。 -
我无法发布解决方案,因为这并没有解决,但是我在这里遇到的问题是误解了 unset 如何与垃圾收集一起工作。一般来说,我认为可能存在一些 php 错误。我不得不处理大约 100 万个元素的数组,并且出现了奇怪的情况。我试图控制内存使用(吸取了教训 - 不值得),所以在 200.000 个元素之后有 70mb 的使用量。但是在 200.001 上突然 140mb,此时内存使用量已超出但 php 仍向未设置的块移动。