Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP unset导致内存耗尽_Php_Memory_Unset - Fatal编程技术网

PHP unset导致内存耗尽

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

在我的脚本中,我想清除数组元素以从不再使用的数据中释放内存

我发现自己处于一种奇怪的情况,使用unset()会导致:

(!)致命错误:允许的内存大小134217728字节已用尽 (试图分配16777224字节)在 …第60行的/models/Persons.php

这是导致此问题的代码部分:

$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
,我已经看到内存泄漏-可能是问题所在。