Я пытаюсь понять, как PHP загружает массивы в память и когда передача массива потребляет память.
Итак, у меня получилось немного кода: обратите внимание, что входной массив менее важен в этом примере:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
echo $this->getMemoryUsage();
Это потребляет ровно 250 кбайт памяти, это означает, что размер массива составляет примерно 250 кБ, примерно.
Итак, я запустил следующий код:
<?php
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
$bar = $foo;
$bar[4]['id'] = 'changing this value again and again';
$far = $bar;
$far[5]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
В соответствии с тем, что я прочитал и сказал, PHP фактически не копирует массив, он ссылается только на исходный массив , но после того, как было сделано изменение. PHP должен скопировать весь массив.
Представьте мое удивление, когда приведенный выше код потребляет ровно 500 КБ ОЗУ.
Кто-нибудь может объяснить, что здесь происходит?
Чтобы быть ясным, все эти индексы (0-5 и id
) уже существуют в исходном массиве, Im просто модифицирует значение. Исходным значением является некоторое целое число.
ИЗМЕНИТЬ
Просто, чтобы очистить участие $this- > result(); Вот еще одно испытание, которое я провел:
echo $this->getMemoryUsage();
$arr = $query->result_array(); // array of arrays from codeigniter
//$arr[0]['id'] = 'changing this value';
$foo = $arr;
$foo[2]['id'] = 'changing this value again';
//$bar = $foo;
//$bar[4]['id'] = 'changing this value again and again';
//
//$far = $bar;
//$far[4]['id'] = 'changing this value again and again and again';
echo $this->getMemoryUsage();
На этот раз вывод будет точно 250 kB - точно так же, как оригинальная пробная версия без каких-либо изменений
РЕДАКТИРОВАТЬ № 2
В соответствии с запросом я запустил код здесь, в моей настройке, чтобы убедиться, что результаты согласованы: http://pastebin.com/cYNg4cg7
Вот результаты:
ДЕКЛАРАЦИЯ: 4608 kB
ОКОНЧАТЕЛЬНО: 8904 kB
DIFF TO DECLARATION: 4296 kB
Итак, хотя объявление было 4608, и массив был передан и изменен 4 раза, он все же только меньше, чем удвоил объем памяти.
РЕДАКТИРОВАТЬ № 3
Я выполнял изменения памяти после каждого выделения:
ДЕКЛАРАЦИЯ: 5144 kB
выделение A0 добавлено: 144 kB
выделение А1 добавлено: 1768 kB
выделение A2 добавлено: 1768 kB
выделение A3 добавлено: 1768 kB
ОКОНЧАТЕЛЬНЫЙ: 10744 kB
DIFF TO DECLARATION: 5600 kB
Каждая следующая операция после первого стоит точно так же, что, похоже, указывает на точный размер, который копируется. Это похоже на поддержку ответа Остина. Единственное, что сейчас не складывается, это размер, который был выделен. Но это другой вопрос.
Кажется, что Остин на балу, я соглашусь, если не будет ответа.