Как лучше всего предотвратить потерю памяти при очистке массива строк php v5.6 - PullRequest
1 голос
/ 19 июня 2020

Чтобы предотвратить потерю памяти и «узкие места» памяти, я в настоящее время очищаю / маркирую память для освобождения в массиве строк, используя:

//
// Clear each of the possibly thousands of long strings contained in the
// $strMAINs array elements and mark them for subsequent memory release.
// No other variables reference the strings in this array.
//

for( $c = ( count( $strMAINs ) - 1 ); $c >= 0; --$c ) {

    $strMAINs[  $c ] = '';
    unset( $strMAINs[  $c ] );

}

//
// Do the same for the overall array, unless the array is to reused before
// the overall code execution is complete.
//

$strMAINs = '';
unset( $strMAINs );

//
// Make an empty array with the same variable name available for subsequent
// use.
//

$strMAINs = [];  // Actually, this isn't needed.  Just don't clear the whole
                 // variable so the array can be reused! 

Однако в конце приведенного выше кода -chunk, массив $ strMAINs затем повторно назначается новым пустым, так что эта переменная готова для последующих назначений с использованием

$strMAINs[] = some string value or string variable;

Я видел другие вопросы по этому топу c, которые рекомендуют использовать только unset ($ variable ); , но тогда в ответах не указывается, что массив unset не освобождает немедленно память, а вместо этого откладывает это до конец выполнения кода или объем памяти становится достаточно низким, чтобы вызвать сборку мусора, что, как я думаю, сильно снижает производительность, потому что он должен `` искать '' столько ожидающих больше не использующих память переменных, сколько может найти, тогда как любые переменные, которые явно 'отмечены как выпущенные' , вероятно, легче найти, и если после выпуска их будет достаточно, чтобы устранить избыточное все условия нехватки памяти оптимизируют операцию по сборке мусора.

Итак, это оставляет мне несколько вопросов:

  1. Помогает ли на самом деле присвоение пустых строк, '' или NULL каждому элементу, когда новые значения будут присвоены элементам? Однако не обязательно одинаковое количество элементов, может быть меньше или больше.

  2. Если назначение элемента l oop действительно полезно, есть ли лучшая PHP функция / оператор делать то же самое, что усваивает выполнение всего цикла и присваиваний за один этап обработки интерпретатора PHP, а не серию отдельных шагов интерпретации / выполнения, которые затем обрабатываются индивидуально? Или, лучше всего использовать оператор присваивания $ strMAINs = []; , который не рискует потерять память и быстро освобождает память, удерживаемую старыми элементами, и снижает частоту зависания веб-сервера при сборке мусора происходит.

Спасибо

1 Ответ

0 голосов
/ 19 июня 2020

Когда вы присваиваете что-либо переменной, если это пустая строка, нулевое значение или пустое значение, что-то определено в памяти.

unset принудительное немедленное освобождение памяти. Все остальное сделает сборщик мусора. Поэтому, когда у вас есть массив и вы хотите освободить память, отключите элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...