在我的脚本中,我想清除数组元素以释放不再使用的数据中的内存。
我发现自己处于一种奇怪的情况,使用 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]);
}
脚本可以正常工作而不会被重置。
现在的问题是:
我已经检查了这个例子,
好吧,null确实可以以其他方式工作,因为脚本死于第61行-未设置第3行。
答案 0 :(得分:0)
这是一个很好的问题,为什么您的病情困扰着您的记忆。但是您将$this->xml_records_chunk
称为代码中的变量。因此,我建议您使用一个包含所有现有元素的数组,以便您已经分配了完整的内存。
我认为在那种情况下,您不需要清理阵列和内存,因为您已经分配了该内存。 GC还不错。因此,如果脚本不再使用该变量,则会对其进行清理。
在您的情况下,我建议您更改数组结构,并将迭代器放在值的第一个条目中,如下所示:
$this->xml_records_chunk[$chunks_count]['phones']
那么您将具有以下结构
$this->xml_records_chunk[$chunks_count] = [
'phones',
'...',
'...
]
然后您可以使用
取消设置一个完整的数组来进行清洁 unset($this->xml_records_chunk[$chunks_count])
这可以减少问题的发生,也许您可以检查Iterator-Interface来迭代和删除数据。