在从缓存读取后将Python对象(列表,字典,字符串等)保存到缓存和解压缩之前,压缩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 / unpickle是由cmemcache库完成的。我不知道在哪里放压缩/解压缩代码。
答案 0 :(得分:5)
首先 - 你确定需要吗?您的数据结构是否太大而不适合缓存中的未压缩?压缩/解压缩会产生开销,这可能会使您通过缓存获得的任何收益无效。
如果您确实需要压缩,那么您可能想要使用zlib。
如果您打算使用zlib,您可能需要尝试compress
方法中可用的不同压缩级别,以平衡CPU时间与压缩级别:
zlib.compress(string[, level])
压缩字符串中的数据,返回包含压缩数据的字符串。level
是1到9的整数,用于控制压缩级别; 1是最快的并且产生最小的压缩,9是最慢的并且产生最多。默认值为6.如果发生任何错误,则引发error
异常。
答案 1 :(得分: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在其memcache后端中实现“set”命令的实现:
def set(self, key, value, timeout=0):
self._cache.set(smart_str(key), value, self._get_memcache_timeout(timeout))
显然它没有“min_compress_len”参数。