/ / कैश को बचाने से पहले अजगर वस्तुओं को संपीड़ित करें - django, कैशिंग, मेम्केड, संपीड़न, विघटन

कैश को बचाने से पहले पायथन वस्तुओं को संपीड़ित करें - django, कैशिंग, memcached, संपीड़न, decompression

कैश से पढ़ने के बाद कैश और डीकंप्रेस को बचाने से पहले पायथन ऑब्जेक्ट्स (सूची, शब्दकोश, स्ट्रिंग, आदि) को संपीड़ित करने के लिए क्या तेज़ तरीका है?

मैं 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))

लगता है कि अचार / अनपेकल cmemcache लाइब्रेरी द्वारा किया जाता है। मुझे नहीं पता कि सेक / डिकम्पप्रेस कोड कहां रखा जाए।

उत्तर:

जवाब के लिए 5 № 1

सबसे पहले - क्या आपको यकीन है कि आपको इसकी आवश्यकता है? क्या आपकी डेटा संरचनाएं कैश में असम्पीडित होने के लिए बहुत बड़ी हैं? संपीड़न / अपघटन के लिए एक ओवरहेड होने जा रहा है, जो आपको पहले स्थान पर कैशिंग द्वारा किए गए किसी भी लाभ को शून्य कर देगा।

यदि आपको वास्तव में संपीड़न की आवश्यकता है, तो आप शायद उपयोग करना चाहते हैं Zlib.

यदि आप zlib का उपयोग करने जा रहे हैं, तो आप उपलब्ध विभिन्न संपीड़न स्तरों के साथ प्रयोग करना चाह सकते हैं compress सीपीयू समय बनाम संपीड़न स्तरों को संतुलित करने के लिए विधि:

zlib.compress(string[, level])
स्ट्रिंग में डेटा संपीड़ित करता है, एक स्ट्रिंग लौटाता है जिसमें संपीड़ित डेटा होता है। level 1 से 9 तक पूर्णांक है जो संपीड़न के स्तर को नियंत्रित करता है; 1 सबसे तेज़ है और कम से कम संपीड़न पैदा करता है, 9 सबसे धीमा है और सबसे अधिक उत्पादन करता है। डिफ़ॉल्ट मान 6. है error कोई त्रुटि होने पर अपवाद।


जवाब के लिए 4 № 2

मैंने आगे अजगर-मेमकेच स्रोत कोड में देखा।

इसने मेमबेड भेजने से पहले 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 का कार्यान्वयन है:

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

जाहिरा तौर पर इसमें "min_compress_len" पैरामीटर नहीं है।