Кэширование объекта размером 302 МБ - PullRequest
5 голосов
/ 13 апреля 2011

У меня есть объект (на самом деле, массив объектов) размером 302 МБ.Когда я пытаюсь кэшировать его с помощью memcached, он не работает, независимо от того, сколько памяти я отдаю memcached, по-видимому, потому что у memcached есть ограничение в 1 МБ для объектов, которые он может кэшировать.(Возможно, я ошибаюсь в этой последней части. Я не смог найти отличную документацию.)

Есть предложения о том, как кешировать эту вещь?Я использую PHP / Symfony в Linux.

Ответы [ 4 ]

12 голосов
/ 13 апреля 2011

Цитирование

15.5.5.4: Каков максимальный размер объекта, который вы можете сохранить в memcache, и настраивается ли он?

Максимальный размер объекта по умолчанию составляет 1 МБ. В memcached 1.4.2 и более поздних версиях вы можете изменить максимальный размер объекта, используя опцию командной строки -I.

Для версий до этого, чтобы увеличить этот размер, вы должны перекомпилировать memcached. Вы можете изменить значение POWER_BLOCK в файле slabs.c внутри источника.

В memcached 1.4.2 и выше вы можете настроить максимальный поддерживаемый размер объекта, используя опцию командной строки -I. Например, чтобы увеличить максимальный размер объекта до 5 МБ:

 $ memcached -I 5m

Однако даже при увеличении памяти это вряд ли удачный выбор для ИМО. Лучше было бы разбить объект на более мелкие части, а затем кэшировать его отдельные части.

Цитата Почему размер элементов не превышает 1 мегабайт?

Краткий ответ: из-за того, как работает алгоритм распределителя памяти.

Длинный ответ: механизм хранения памяти Memcached (который будет подключен / скорректирован в будущем ...), использует подход slabs к управлению памятью. Память разбита на куски слябов разных размеров, начиная с минимального числа и повышаясь от факториала до максимально возможного значения.

Допустим, минимальное значение составляет 400 байтов, максимальное значение составляет 1 мегабайт, а факториал равен 1,20:

плита 1 - 400 байт плита 2 - 480 байт плита 3 - 576 байт ... и т. Д.

Чем больше плита, тем больше зазор между ней и предыдущей плитой. Таким образом, чем больше максимальное значение, тем менее эффективно хранилище памяти. Memcached также должен предварительно выделить некоторое количество памяти для каждой существующей плиты, поэтому установка меньшего факториала с большим максимальным значением потребует еще больше накладных расходов.

Есть и другая причина, по которой вы не хотите этого делать ... Если мы говорим о веб-странице и пытаемся сохранить / загрузить такие большие значения, вы, вероятно, делаете что-то не так. При таком размере загрузка и распаковка структуры данных в память займет заметное количество времени, и ваш сайт, вероятно, будет работать не очень хорошо.

Если вы действительно хотите хранить элементы размером более 1 МБ, вы можете перекомпилировать memcached с отредактированным значением slabs.c: POWER_BLOCK или использовать неэффективный malloc / free backend. Другие предложения включают базу данных, MogileFS и т. Д.

1 голос
/ 24 марта 2015

В качестве альтернативы вы можете быстро изменить лимит, отредактировав файл конфигурации [/etc/memcached.conf], добавив:

# Increase limit 
-I 512M

После перезапуска службы.

0 голосов
/ 13 апреля 2011

Возможно, вы могли бы использовать разделяемую память (но с таким размером я бы проголосовал против) или использовать ОЗУ.

Это для одного веб-сервера или вы ищете общий кеш для нескольких веб-серверов?

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

0 голосов
/ 13 апреля 2011

Нет способа для кэширования экземпляра объекта (или массива) объемом 302 МБ.

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

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