Сжатие объектов Python перед сохранением в кеш - PullRequest
5 голосов
/ 18 августа 2010

Какой быстрый метод сжатия объектов Python (список, словарь, строка и т. Д.) Перед сохранением их в кэш и распаковка после чтения из кэша?

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

Я изучил django / core / cache / backends / memcached.py

import cmemcache as memcache

class CacheClass(BaseCache):

    def __init__(self, server, params):
        BaseCache.__init__(self, params)
        self._cache = memcache.Client(server.split(';'))

    def get(self, key, default=None):
        val = self._cache.get(smart_str(key))
        if val is None:
            return default
        return val

    def set(self, key, value, timeout=0):
        self._cache.set(smart_str(key), value, self._get_memcache_timeout(timeout))

Похож на pickle /открепление выполняется библиотекой cmemcache.Я не знаю, куда поместить код сжатия / распаковки.

Ответы [ 2 ]

5 голосов
/ 18 августа 2010

Во-первых - ты уверен, что тебе это нужно? Ваши структуры данных слишком велики, чтобы помещать их в кэш без сжатия? Сжатие / декомпрессия будут сопряжены с дополнительными затратами, которые могут аннулировать любые выгоды, которые вы получили, кэшируя в первую очередь.

Если вам действительно нужно сжатие, то вы, вероятно, захотите использовать zlib .

Если вы собираетесь использовать zlib, вы можете поэкспериментировать с различными уровнями сжатия, доступными в методе compress, чтобы сбалансировать время ЦП и уровни сжатия:

zlib.compress(string[, level])
Сжимает данные в строку, возвращая строку, содержащую сжатые данные. level - целое число от 1 до 9, управляющее уровнем сжатия; 1 - самый быстрый и производит наименьшее сжатие, 9 - самый медленный и производит больше всего. Значение по умолчанию - 6. Вызывает исключение error, если возникает какая-либо ошибка.

4 голосов
/ 19 августа 2010

Я посмотрел дальше в исходный код python-memcache.

Он уже поддерживает сжатие значений с помощью zlib перед отправкой их в memcached.

lv = len(val)
# We should try to compress if min_compress_len > 0 and we could
# import zlib and this string is longer than our min threshold.
if min_compress_len and _supports_compress and lv > min_compress_len:
    comp_val = compress(val)
    # Only retain the result if the compression result is smaller
    # than the original.
    if len(comp_val) < lv:
        flags |= Client._FLAG_COMPRESSED
        val = comp_val

def _set(self, cmd, key, val, time, min_compress_len = 0):

Вот реализация Django для команды "set" в ее бэкэнде memcache:

def set(self, key, value, timeout=0):
    self._cache.set(smart_str(key), value, self._get_memcache_timeout(timeout))

По-видимому, он не имеет параметра "min_compress_len".

...