Сайт Романа ПарпалакаБлог20111223

Оптимизация памяти в PHP и функция serialize

23 декабря 2011 года, 01:43

Хорошая статья на Хабре про особенности выделения памяти в PHP. Обычно на расход памяти в php-скриптах никто не обращает внимания. Но иногда бывают ситуации, когда стандартных 16 мегабайт оказывается недостаточно. Тогда приходится изобретать различные трюки.

Не так давно я писал требовательный к памяти скрипт. Это скрипт поиска, ранняя версия которого используется на сайте правил русского языка, а адаптированная версия перекочевала в мой движок сайтов.

Я немного поколдовал с кодом и в итоге сократил потребление памяти более чем в два раза. Раньше для индексации этого сайта нужно было 32 мегабайта оперативной памяти, а теперь достаточно и 16. Кроме методов из статьи, я применил запись чисел в системе счисления по основанию 36 (перевод осуществляется функцией base_convert()) и оптимизировал функцию serialize(). Опишу последний метод подробнее.

Дело в том, что функция serialize() расходует много памяти, и об этом написано в документации. Если ей передать большой массив, доступная скрипту память может закончиться. Относительно простой выход из положения существует, когда массив нужно сохранить в файл. Функцию serialize() можно применять к отдельным элементам массива, как в следующем фрагменте кода:

file_put_contents($filename, 'a:'.count($array).':{');
$buffer = '';
$length = 0;
foreach ($array as $word => $data)
{
    $chunk = serialize($word).serialize($data);
    $length += strlen($chunk);
    $buffer .= $chunk;
    if ($length > 100000)
    {
        file_put_contents($filename, $buffer, FILE_APPEND);
        $buffer = '';
        $length = 0;
    }
}
file_put_contents($filename, $buffer.'}', FILE_APPEND);

Запись происходит порциями размером около 100 килобайт. Этот код подходит для сохранения в файл массива с большим количеством элементов среднего размера и решает проблему перерасхода памяти функцией serialize().

Поделиться

Я дома Ctrl Осторожно, психолог!

Читайте также

Как правильно представлять и обрабатывать состояние фильтров в коде
Фильтры в интерфейсах интернет-магазинов имеют одну особенность.
2024
Динамические и статические массивы
Я собираюсь рассказать об одном нетривиальном эффекте, заключающемся в существенном замедлении работы программ при переходе от статических массивов к динамическим в некоторых ситуациях.
2008

Комментарии

#1. 2 сентября 2015 года, 16:27. Теплые тапки пишет:
НичОсе, давно искал такой труд, отлично написано. Респект.

Оставьте свой комментарий


Формулы на латехе: $$f(x) = x^2-\sqrt{x}$$ превратится в $$f(x) = x^2-\sqrt{x}$$.
Выделение текста: [i]курсивом[/i] или [b]жирным[/b].
Цитату оформляйте так: [q = имя автора]цитата[/q] или [q]еще цитата[/q].
Других команд или HTML-тегов здесь нет.

Записи