не совсем вопрос, но не многовато ли массивы потребляют памяти?

ustas

Элекомист №1
не совсем вопрос, но не многовато ли массивы потребляют памяти?

Столкнулся с лимитом выделяемой памяти, посмотрел, эти гады(массивы) все скушали
в тесте текст на 200 кб превращается почти в пять мегов.
Получается остальное занимает индекс? Жжутся что то такие индексы, допустим ++4mb / 50000 = 80-100 байт
на каждый индекс?
Причем в конкретном примере можно array_fill(,, '1'); или array_fill(, ,'12345678');,
это больше чем среднее 3 (символа) в str_repeat("Это текст на 100 кб \n", 10000);
и видим array_fill экономит почти метр,. значит индекс на те же данные меньше и возможна
оптимизация или это связано с постоянным (news)Improved Zend Memory Manager ;)

После этого я понял почему одна (ну всем она не нравится) cms требует 32 мб,
особенно когда посмотрел чем она кушает.
выводы пока не делаю ...

да кстати сначала думал может с классами проблема, оказывается что нет. ArrayObject еще поюзаю, может не так кушает?

ссылка на пример http://www.phpclub.ru/paste/1851
результат
старт 94 056 кб
str_repeat * 10000 304 200 кб
unset(new Test()) 4 968 288 кб
50001$test->parse 4 968 976 кб
unset($block) 368 680 кб
50001explode 4 969 336 кб
implode(null, $block) 528 960 кб
unset($block) 368 736 кб
50001array_fill $block 3 004 080 кб
конец 368 808 кб
 

Alexandre

PHPПенсионер
массив в пхп реализован посредством хештавлиц (двух или трех). Реализация хештабтицы - это выделение памяти с запасом. Не знаю алгоритма, как это реализовано в STL, но в С# там вообще сделано по тупому - если выделение памяти не хватает первоночальному значению, напр - 1К, то берется удвоенное значение памяти... и так удваивается - пока памяти не станет хватать. Если учесть, что реализация хештейблов в ДотНете была слизана с СТЛ, то очевидно в СТЛ - такая же проблема.

Еще необходимо выделить память под имена переменных... короче - выделение памяти для текста на много больше, чем сам текст.
 

ustas

Элекомист №1
Alexandre ты прав, почти. не удваивается конечно, но 25 - 30% выходит.
проверил так : array_fill(), в цикле заменял значения, размер почти не увеличился, да и скорость выросла, наверно память не перераспределяет.

-~{}~ 14.08.07 19:44:

http://www.phpclub.ru/paste/1852

ArrayObject оказался чуть меньше. и чуть быстрее, что уже странно.

старт 81 072 кб
str_repeat * 10000 291 296 кб
50001$arrayobject 4 954 576 кб
50001explode 4 954 584 кб
implode(null, $block) 516 344 кб
unset($block) 356 176 кб
50001array_fill $block 2 983 656 кб
конец 356 200 кб
 
Сверху