Django缓存大量列表

时间:2012-08-08 22:52:56

标签: django caching memcached deserialization pickle

我的django应用程序处理25MB二进制文件。它们每个都有大约100,000个“记录”,每个256字节。

从磁盘读取二进制文件并使用python的struct模块解码它需要大约7秒钟。我将数据转换为大约100,000个项目的列表,其中每个项目都是一个字典,其中包含各种类型的值(浮点数,字符串等)。

我的django视图需要搜索此列表。显然7秒太长了。

我尝试使用django的低级缓存API来缓存整个列表,但这不起作用,因为任何单个缓存项目的最大大小限制为1MB。我已经尝试过单独缓存100,000个列表项目,但这需要花费超过7秒的时间 - 大部分时间都用于解开项目。

是否有方便的方法在请求之间在内存中存储大型列表?您能想到另一种缓存对象以供我的django应用程序使用的方法吗?

2 个答案:

答案 0 :(得分:6)

将项目大小限制编辑为10米(大于1米),添加

-I 10m

到/etc/memcached.conf并重新启动memcached

还可以在位于/usr/lib/python2.7/dist-packages/django/core/cache/backends的memcached.py中编辑此类,如下所示:

class MemcachedCache(BaseMemcachedCache):
"An implementation of a cache binding using python-memcached"
def __init__(self, server, params):
    import memcache
    memcache.SERVER_MAX_VALUE_LENGTH = 1024*1024*10 #added limit to accept 10mb
    super(MemcachedCache, self).__init__(server, params,
                                         library=memcache,
                                         value_not_found_exception=ValueError)

答案 1 :(得分:3)

我还无法添加评论,但我想分享我对这个问题的快速解决方法,因为当你在导入时更改SERVER_MAX_VALUE_LENGTH时,我遇到了与python-memcached相同的问题。

好吧,除了FizxMike建议的__init__编辑之外,你还可以在同一个类中编辑_cache属性。这样做可以实例化显式传递server_max_value_length的python-memcached客户端,如下所示:

from django.core.cache.backends.memcached import BaseMemcachedCache

DEFAULT_MAX_VALUE_LENGTH = 1024 * 1024

class MemcachedCache(BaseMemcachedCache):
    def __init__(self, server, params):
        #options from the settings['CACHE'][connection]
        self._options = params.get("OPTIONS", {})
        import memcache
        memcache.SERVER_MAX_VALUE_LENGTH = self._options.get('SERVER_MAX_VALUE_LENGTH', DEFAULT_MAX_VALUE_LENGTH)

        super(MemcachedCache, self).__init__(server, params,
                                             library=memcache,
                                             value_not_found_exception=ValueError)

    @property
    def _cache(self):
        if getattr(self, '_client', None) is None:
            server_max_value_length = self._options.get("SERVER_MAX_VALUE_LENGTH", DEFAULT_MAX_VALUE_LENGTH)
            #one could optionally send more parameters here through the options settings,
            #I simplified here for brevity
            self._client = self._lib.Client(self._servers,
                server_max_value_length=server_max_value_length)

        return self._client

我也更喜欢创建另一个继承自BaseMemcachedCache的后端,并使用它而不是编辑django代码。

这里是django memcached后端模块供参考: https://github.com/django/django/blob/master/django/core/cache/backends/memcached.py

感谢您对此主题的所有帮助!