2010-08-18 54 views
5

在從緩存中讀取之後將Python對象(列表,字典,字符串等)保存到緩存和解壓縮之前,什麼是快速壓縮Python對象的方法?在保存到緩存之前壓縮Python對象

我正在使用Django,我希望直接在Django的緩存後端添加壓縮/解壓縮支持,這使得它可用於我的所有Django應用程序。

我看着Django的/核心/緩存/後端/ 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)) 

看起來像泡菜/ unpickle由cmemcache庫完成。我不知道在哪裏放置壓縮/解壓縮代碼。

回答

4

我進一步查看了python-memcache的源代碼。

在將它們發送到memcached之前,它已經支持zlib的壓縮值。

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的在其內存緩存後臺「設置」命令FPGA實現:

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

顯然,它不具有「min_compress_len」參數。

5

首先 - 你確定你需要它嗎?你的數據結構是否太大以適應緩存中的未壓縮?壓縮/解壓縮將會產生開銷,這可能會使您首先通過緩存取得的任何收益失效。

如果你真的需要壓縮,那麼你可能要使用zlib

如果你要使用zlib,你可能會想在compress方法可用不同的壓縮級別進行實驗,以平衡CPU時間與壓縮級別:

zlib.compress(string[, level])
壓縮字符串數據,返回一個包含壓縮數據的字符串。 level是一個從1到9的整數,用於控制壓縮的級別; 1是最快的並且產生最小的壓縮,9是最慢的並且產生最多的。缺省值爲6.如果發生任何錯誤,則引發error異常。

+0

我的服務器是IO綁定和RAM綁定,而不是CPU綁定。當前的memcached分配使用1.3GB的RAM。因此,將數據壓縮50%可節省650MB RAM,或者可以在緩存中存儲兩次以上的項目。 – jack 2010-08-18 12:08:23

+0

@jack - 看我的編輯 - 祝你好運! – 2010-08-18 12:11:48

+0

謝謝,我投了你的答案。但我希望找到一個更通用的解決方案,它在緩存後端進行修改。 – jack 2010-08-18 15:43:46