Неустановленный PHP вызывает истощение памяти - PullRequest
0 голосов
/ 16 декабря 2018

В моем скрипте я хотел очистить элементы массива, чтобы освободить память от больше не используемых данных.

Я оказался в странной ситуации, когда использовал 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-й сброшен.

1 Ответ

0 голосов
/ 16 декабря 2018

Это хороший вопрос, почему ваш unset ломает вашу память.Но вы называете $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-Интерфейс для итерации и удаления ваших данных.

...