Intereting Posts
не удалось запустить кодирование в виртуальной машине -Минк не найден и не загружен Lavavel 5.2.36 МетодNotAllowedHttpException в строке RouteCollection.php 218: Длительный опрос – система сообщений Почему DateTime :: createFromFormat () терпит неудачу и возвращает логическое значение в моем втором примере? Не удается отправить электронную почту PHPMailer 6.0 с помощью Oauth Google Как запустить скрипт оболочки в PHP? Как считать простое число от 0 до 100000000 менее чем за 1 минуту в PHP? Проверка значений MySQL NULL с помощью PHP PHP MySQL Yii – чтение базы данных не пишет Joomla 2.5 получает конфигурацию компонента в config.xml ВСЕГДА возвращают null mysql-запрос для создания дружественного URL-адреса SEO из данной структуры таблицы CakePhp не работает в Ubuntu 14.04 Как включить генерируемые страницы CodeIgniter? Передача массива requestAction в CakePHP Серверная часть DataTable работает только тогда, когда у меня есть несколько данных

Кэширование объекта 302 МБ

У меня есть объект (фактически, массив объектов), то есть 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 объекта (или массив объектов) для кэширования.

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