У меня есть объект (фактически, массив объектов), то есть 302 МБ. Когда я пытаюсь кэшировать его с memcached, он не работает, независимо от того, сколько памяти я передаю memcached, по-видимому, потому что memcached имеет ограничение 1 МБ на объекты, которые он может кэшировать. (Возможно, я ошибаюсь в этой последней части. Мне не удалось найти отличную документацию.)
Любые предложения о том, как кешировать эту вещь? Я использую PHP / symfony в Linux.
квотирование
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 (который будет подключаться / настраиваться в будущем …), использует подход с перекрытием к управлению памятью. Память разбивается на куски разных размеров, начиная с минимального количества и возрастая на факториал до максимально возможного значения.
Скажем, минимальное значение – 400 байт, а максимальное значение – 1 мегабайт, а факторный – 1,20:
плита 1 – 400 байт плита 2 – 480 байт плита 3 – 576 байт … и т. д.
Чем больше плита, тем больше промежутка между ней и предыдущей плитой. Таким образом, чем больше максимальное значение, тем меньше эффективность памяти. Memcached также должен предварительно выделить некоторую память для каждой имеющейся плиты, поэтому установка меньшего факториала с большим максимальным значением потребует еще больших накладных расходов.
Есть и другие причины, по которым вы не хотели бы этого делать … Если мы говорим о веб-странице, и вы пытаетесь сохранить или загрузить значения, большие, вы, вероятно, делаете что-то неправильно. При таком размере потребуется некоторое время для загрузки и распаковки структуры данных в память, и ваш сайт, скорее всего, не будет работать очень хорошо.
Если вы действительно хотите хранить элементы размером более 1 МБ, вы можете перекомпилировать memcached с измененным значением slabs.c: POWER_BLOCK или использовать неэффективный сервер malloc / free. Другие предложения включают базу данных, MogileFS и т. Д.
В качестве альтернативы вы можете быстро изменить предел, отредактировав файл конфигурации [/etc/memcached.conf], добавив:
# Increase limit -I 512M
После перезагрузки службы.
Возможно, вы могли бы использовать разделяемую память (но с этим размером я бы проголосовал против) или использовать RAM-диск.
Это для одного веб-сервера или вы ищете общий кэш для нескольких веб-серверов?
Я все еще присоединяюсь к другим, когда они говорят, что вам, вероятно, нужен другой подход. Попытайтесь объяснить, какие данные вы хотите кэшировать.
Нет никакого способа, чтобы вам понадобился экземпляр 302Mb объекта (или массив объектов) для кэширования.
Не видя кода, я не могу предложить, как … но должен быть хороший способ реорганизации, чтобы вы кэшировали в меньшем масштабе.