2010-08-18 22 views
5

Phương pháp nhanh để nén các đối tượng Python (danh sách, từ điển, chuỗi, vv) trước khi lưu chúng vào bộ nhớ cache và giải nén sau khi đọc từ bộ nhớ cache là gì?Nén các đối tượng Python trước khi lưu vào bộ nhớ cache

Tôi đang sử dụng Django và tôi hy vọng sẽ thêm hỗ trợ nén/giải nén trực tiếp trong bộ đệm ẩn của Django, giúp nó khả dụng cho tất cả các ứng dụng Django của tôi.

Tôi nhìn vào django/lõi/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)) 

Hình như dưa/unpickle được thực hiện bằng cmemcache thư viện. Tôi không biết nơi để đặt mã nén/giải nén.

Trả lời

4

Tôi đã xem xét thêm về mã nguồn của python-memcache.

Nó đã hỗ trợ nén giá trị bằng zlib trước khi gửi chúng đến 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): 

Đây là implemention của Django để "thiết lập" lệnh trong backend memcache của nó:

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

Rõ ràng nó không có "min_compress_len" tham số.

5

Trước hết - bạn có chắc là bạn cần nó không? Cấu trúc dữ liệu của bạn có quá lớn chỉ để vừa với bộ đệm không nén? Sẽ có một chi phí cho việc nén/giải nén, điều đó có thể làm mất hiệu lực bất kỳ lợi ích nào bạn đã thực hiện bằng bộ nhớ đệm ngay từ đầu.

Nếu bạn thực sự cần nén, thì bạn có thể muốn sử dụng zlib.

Nếu bạn đang sử dụng zlib, bạn có thể muốn thử nghiệm với các mức độ nén khác nhau có sẵn trong phương pháp compress, để cân bằng thời gian CPU vs mức nén:

zlib.compress(string[, level])
Nén dữ liệu trong chuỗi , trả về một chuỗi chứa dữ liệu nén. level là một số nguyên từ 1 đến 9 kiểm soát mức độ nén; 1 là nhanh nhất và tạo ra nén ít nhất, 9 là chậm nhất và tạo ra nhiều nhất. Giá trị mặc định là 6. Tăng ngoại lệ error nếu xảy ra bất kỳ lỗi nào.

+0

Máy chủ của tôi bị ràng buộc IO và RAM bị ràng buộc, không phải CPU bị ràng buộc. Phân bổ memcached hiện tại sử dụng 1,3 GB RAM. Vì vậy, nén dữ liệu bằng 50% tiết kiệm được 650MB RAM hoặc làm cho nó có thể lưu trữ hai lần nhiều mục trong bộ nhớ cache. – jack

+0

@jack - xem chỉnh sửa của tôi - chúc may mắn! –

+0

cảm ơn, tôi đã bình chọn câu trả lời của bạn. Nhưng tôi hy vọng sẽ tìm thấy một giải pháp chung chung hơn mà sửa đổi trong bộ đệm ẩn phụ trợ. – jack

Các vấn đề liên quan