Максимальный размер объекта, который можно сохранить в memcached с помощью memcache.py

Мне нужно вернуть пользователю довольно большой файл (11 МБ). По определенным причинам я не могу просто предоставить прямой url для файла ( http://www.sample.com/mybigfile.exe ); вместо этого он должен быть доступен через код.

Вместо того, чтобы читать его с диска снова и снова, я думал сохранить его в memcached (если это не очень хорошая идея, дайте мне знать). Кажется, все работает, отлично (без ошибок), но когда я пытаюсь извлечь файл из memcached, я всегда получаю None, как будто файл не был кэширован.

Существует ли ограничение размера для того, что можно сохранить?

Вот код:

def download_demo(): """ Returns the demo file """ KEY = "xyz" TIME = 86400 #24 hours buff = memc.get(KEY) if not buff: file = open(FILENAME, 'r') buff = file.read() memc.set(KEY, buff, TIME) print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" % (os.path.split(FILENAME)[-1], len(buff), buff) 

7 Solutions collect form web for “Максимальный размер объекта, который можно сохранить в memcached с помощью memcache.py”

В memcached часто задаются две записи:

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

Ответ на первый (цитата, акцент мой) :

Максимальный размер значения, который вы можете хранить в memcached, составляет 1 мегабайт . Если ваши данные больше, рассмотрите сжатие клиента или разделите значение на несколько ключей.

Поэтому я предполагаю, что ваш файл размером 11 МБ слишком велик, чтобы вписаться в одну запись memcached.

Как и другие ответы, возможно увеличение размера объекта.

Начиная с memcache 1.4.2, это настраиваемый пользователем параметр:

http://code.google.com/p/memcached/wiki/ReleaseNotes142

Настраиваемый максимальный размер элемента

Многие люди попросили memcached иметь возможность хранить элементы размером более 1 МБ, в то время как обычно рекомендуется, чтобы никто этого не делал, теперь он поддерживается в командной строке.

Несколько просвещенных людей также попросили memcached уменьшить максимальный размер элемента. Это также вариант.

Новый параметр -I позволяет указать максимальный размер элемента во время выполнения. Он поддерживает постфикс единицы, чтобы обеспечить естественное выражение размера элемента.

Примеры:

memcached -I 128k # Отказывать элементы размером более 128k.

memcached -I 10m # Разрешить объекты до 10 МБ

Чтобы суммировать необходимые шаги:

1) Обновить Memcache до версии 1.4.2 или новее.

2) Добавьте флаг -I 15M (или сколько угодно мегабайт) в команду запуска memcache.

Это либо командная строка, либо в Ubuntu, добавьте строку

 -I 15M 

в любом месте /etc/memcached.conf и перезапустите службу.

3) Добавьте необходимый флажок клиенту в memcache.

 import memcache memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15) memc.set(KEY, buff, TIME) 

Если у вас нет прямого доступа к клиенту memcache (т. Е. Работа через фреймворк), просто снимите код memcache напрямую.

На Ubuntu это /usr/local/lib/python2.7/dist-packages/memcache.py. Измените строку:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024

в

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

Очевидно, вам понадобится сделать этот взлом снова, если вы обновите memcache, но это очень простое и быстрое исправление.

В следующей статье объясняется, почему он ограничивает максимальный размер одного файла до 1M.

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

В основном, в memcache есть небольшие фрагменты страниц памяти, внутри которых находятся объекты.

И размер страницы по умолчанию составляет 1M, поэтому максимальный объект, который может содержать страница, ограничен 1M.

Даже если вы можете настроить его для увеличения размера, но я думаю, что это может иметь какой-то компромисс производительности.

Максимальный размер данных – 1 мб на элемент

http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_%281_megabyte%29

Обновление: это ответ 2009 года. И в этот день информация была точной, и источник был официальным. Теперь в 2014 году memcached может хранить 128mb вместо 1mb (но разработчики не потрудились обновлять официальный FAQ). Единственная ссылка, которую кто-то мог найти, – это неясная страница, которая, вероятно, будет мертва через год.

Если вы используете клиент python memcached, убедитесь, что вы также увеличиваете лимит в файле memcache.py клиента вместе с сервером memcached.

~ / Анаконда / Библиотека / python2.7 / сайт-пакеты / memcache.py

 SERVER_MAX_KEY_LENGTH = 250 SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15 

вы можете увидеть в memcached-консоли (telnet localhost 11211)

stats STAT 48: chunk_size 3677344

Кажется, что никто не затрагивает эту часть вопроса:

Вместо того, чтобы читать его с диска снова и снова, я думал сохранить его в memcached (если это не очень хорошая идея, дайте мне знать).

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

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

  • memcache.get возвращает неверный объект (Celery, Django)
  • как вернуть все memcached значения в Google App Engine?
  • Хорошие примеры использования python-memcache (memcached) в Python?
  • Memcached: поддержка автоматического обнаружения python на AWS Elasticache?
  • Что делать, если я хочу сохранить значение None в memcache?
  • Установка pylibmc на Ubuntu
  • Использование нескольких серверов memcache в пуле
  • Как кэшировать разбитый на страницы запрос Django
  • Кэш-представление django с параметрами URL
  • Проблемы с производительностью memcache App Engine / ndb.get_multi
  • Как проверить содержимое кеша Django с помощью Python memcached?
  • Python - лучший язык программирования в мире.