キャッシュに保存する前に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ライブラリによって実行されるようです。私は圧縮/解凍コードをどこに置くべきかわかりません。
回答:
回答№1は5まず、あなたがそれを必要としていると確信していますか? あなたのデータ構造が大きすぎて、キャッシュに圧縮されていないだけですか?圧縮/解凍のオーバーヘッドが発生するため、最初にキャッシュすることで得られた利益を無効にする可能性があります。
実際に圧縮が必要な場合は、おそらく zlib.
zlibを使うつもりなら、さまざまな圧縮レベルを試すことができます。 compress
方法、CPU時間と圧縮レベルのバランスを取る:
zlib.compress(string[, level])
string内のデータを圧縮し、圧縮データを含む文字列を返します。level
圧縮のレベルを制御する1〜9の整数です。 1は最も速く最も圧縮率が低く、9は最も遅く、最も多く発生します。デフォルト値は6です。error
エラーが発生した場合は例外です。
回答№2については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):
以下は、memcacheのバックエンドにある "set"コマンドのDjangoの実装です:
def set(self, key, value, timeout=0):
self._cache.set(smart_str(key), value, self._get_memcache_timeout(timeout))
どうやらそれは "min_compress_len"パラメータを持っていません。