簡體   English   中英

PHP未設置會導致內存耗盡

[英]PHP unset causes memory exhaustion

在我的腳本中,我想清除數組元素以釋放不再使用的數據中的內存。

我發現自己處於一種奇怪的情況下,使用unset()會導致:

(!)致命錯誤:在第60行的... / models / Persons.php中,耗盡了134217728字節的允許內存大小(試圖分配16777224字節)

這是導致此問題的代碼部分:

$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個未設置位置消失。

這是一個很好的問題,為什么您的不適會破壞您的記憶。 但是您在代碼$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來迭代和刪除數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM