Максимальный размер объекта, который можно сохранить в memcached с помощью memcache.py - PullRequest
25 голосов
/ 17 сентября 2009

Мне нужно вернуть довольно большой файл (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 ]

33 голосов
/ 31 июля 2012

Начиная с memcache 1.4.2, этот параметр настраивается пользователем: ReleaseNotes142 * memcached @ Github

Конфигурируемый максимальный размер элемента

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

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

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

Примеры:

memcached -I 128k # Refuse items larger than 128k. 
memcached -I 10m  # Allow objects up to 10MB
31 голосов
/ 17 сентября 2009

Об этом есть в memcached FAQ :

.

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

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

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

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

22 голосов
/ 12 августа 2013

Для суммирования необходимых шагов:

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, но это очень просто и быстро исправить.

2 голосов
/ 17 сентября 2009

Максимальный размер данных составляет 1 МБ на элемент

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

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

1 голос
/ 17 ноября 2016

Никто, кажется, не обращается к этой части вопроса:

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

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

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

1 голос
/ 24 июня 2016

Если вы используете клиент 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)

статистика плит STAT 48: chunk_size 3677344

1 голос
/ 06 мая 2015

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

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

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

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

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

...