Как правильно определить потребляемую память?



@runprogr

В PHP.ini стоит огрничение потребляемой памяти на «2000M»
Такой код

$startMemory = memory_get_usage();

$array = range(1, 33000000);

print_r($endMemory = memory_get_usage() - $startMemory);
print_r(round($endMemory / 1024 / 1024) . ' MB');

Выдает такой результат
1073746000
1024 MB
Если мы увеличиваем массив еще на 1 млн
$array = range(1, 34000000);
То результатом становится

PHP Fatal error:  Allowed memory size of 2097152000 bytes exhausted (tried to allocate 2147483656 bytes)

То есть судя по ошибке, размер массива превысил 2000 МБ и составил 2048 МБ
Вопрос — как размер памяти, занимаемой массивом внезапно скакнул аж в 2 раза при добавлении всего 1 млн значений в 33-миллионный массив ?
Функция memory_get_usage() неверно определяет кол-во занимаемой памяти ?


Решения вопроса 2



@Rsa97

Давайте определим точную границу, где проходит увеличение объёма потребляемой памяти. Это 33554432 элементов.
3355443210 = 200000016
Поищем предыдущий скачок. Он происходит на 16777216 элементах.
1677721610 = 100000016
Проверим дальше. Получим следующие значения:
838860810 = 80000016
419430410 = 40000016
209715210 = 20000016
104857610 = 10000016

810 = 816
Вывод — PHP резервирует память округляя количество элементов вверх до ближайшей степени двойки.



1

комментарий


Ответы на вопрос 0

Добавить комментарий

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