Подтвердить что ты не робот

Максимальный размер объекта, который можно сохранить в 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)
4b9b3361

Ответ 1

В часто задаваемые вопросы о memcached есть две записи:

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

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

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

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

Ответ 2

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

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

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

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

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

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

Примеры:

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

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

Ответ 3

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

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/python 2.7/dist-packages/memcache.py. Измените строку:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024

to

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

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

Ответ 4

Максимальный размер данных - 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). Единственная ссылка, которую кто-то мог найти, нечеткая страница, которая, вероятно, будет мертва через год.

Ответ 5

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

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

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

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

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

Ответ 6

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

~/Анаконда/Library/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

Ответ 7

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

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

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

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