PHP unset导致内存耗尽
在我的脚本中,我想清除数组元素以从不再使用的数据中释放内存 我发现自己处于一种奇怪的情况,使用unset()会导致: (!)致命错误:允许的内存大小134217728字节已用尽 (试图分配16777224字节)在 …第60行的/models/Persons.php 这是导致此问题的代码部分:PHP unset导致内存耗尽,php,memory,unset,Php,Memory,Unset,在我的脚本中,我想清除数组元素以从不再使用的数据中释放内存 我发现自己处于一种奇怪的情况,使用unset()会导致: (!)致命错误:允许的内存大小134217728字节已用尽 (试图分配16777224字节)在 …第60行的/models/Persons.php 这是导致此问题的代码部分: $chunks_count = count($this->xml_records_chunk['fnames']) - 1; for ($num = 0; $num <= $chunks_cou
$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]);
}
$chunks\u count=count($this->xml\u records\u chunk['fnames'])-1;
对于($num=0;$num xml_records_chunk['fnames'])-1;
$not_last=($num<$chunks_count?',':'');
$new_records.='('.$this->xml_records_chunk['fnames'][$chunks_count].,'
.$this->xml\u记录\u块['lnames'][$chunks\u count]。,'
.$this->xml_记录_块['dobs'][$chunks_count].,'
.$this->xml_记录_块['phones'][$chunks_count].')$不是最后一次;
unset($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]);
}
脚本运行良好,没有未设置
现在的问题是:
- 为什么unset会导致内存耗尽李>
- 在这种情况下,取消设置未启用的数组元素的正确方法是什么
Ok null的工作方式确实有点不同,因为它的脚本在第61行-第3行unset上死亡。这是一个很好的问题,为什么unset会破坏内存。但是您可以将
$this->xml\u records\u chunk
作为代码中的变量调用。因此,我建议您拥有一个包含所有现有元素的数组,这样您就已经分配了完整的内存
我认为在这种情况下,您不需要清理阵列和内存,因为您已经分配了该内存。GC没有那么糟糕。因此,如果脚本不再使用该变量,它将被清除
在您的情况下,我建议您更改数组结构,并将迭代器放在值的第一个条目中,如下所示:
$this->xml_records_chunk[$chunks_count]['phones']
那么你有下面的结构
$this->xml_records_chunk[$chunks_count] = [
'phones',
'...',
'...
]
然后,您可以使用一个命令清除整个数组
unset($this->xml\u records\u chunk[$chunks\u count])
这可能会导致较少的问题,也许您可以检查以迭代和删除数据。是
$this->xml\u records\u chunk['fnames']
一个数组或一个实现类似数组的方法的对象吗?您可能希望使用或处理xml而不将整个文件加载到内存中。我使用的是XMLReader<代码>$this->xml\u records\u chunk是一个数组。我无法发布解决方案,因为这个问题没有解决,但是我在这里遇到的问题是对unset如何与垃圾收集一起工作的误解。一般来说,我认为可能有一些php错误。我不得不处理大约100万个元素的阵列,出现了奇怪的情况。我试图控制内存的使用(从中学到了教训——这并不值得),所以在200.000个元素之后,内存的使用量达到了70mb。但是在200.001上突然出现了140mb的内存使用量,此时内存使用量已经超过了使用量,但php仍然向unset块前进。我只看到了一个unset,但我想我会保留我的结构,因为我在很多地方使用它。我们都知道这只是一个小小的改变,但它可能会导致一些额外的错误。顺便说一句,当我调试当前代码时,unset工作得很好——我的意思是,数组0f~240 000个元素缩小到239 999个,所以它工作得很好。Unset本身会删除该变量。但是我想我已经知道了什么可能会导致这个问题——稍后将测试它,并检查迭代器接口。好的,所以我认为分配$new_records
会破坏内存,但它不会。只留下未设置项会在第二个未设置项时中断内存。也许你们知道我是否可以用xdebug+phpStorm检查给定位置使用了多少内存?或者类似Htop for linux的东西?我发现了这个xdebug_profiler
和kcache
,我已经看到内存泄漏-可能是问题所在。