Django的缓存的大名单(Django caching a large list)

2019-07-30 21:26发布

我的Django应用涉及25MB的二进制文件。 他们每个人都有约10万每256个字节的“记录”。

我花了大约7秒从磁盘读取的二进制文件,并使用Python的结构模块解码。 我把数据转换成约10万项,其中每个项目是不同类型(浮点,字符串等)的值的字典的列表。

我的Django的意见需要通过这个列表来搜索。 显然7秒太长。

我一直在使用Django的低级别的缓存API来缓存整个列表尝试,但不会工作,因为有1MB的任何单个缓存项的最大大小限制。 我试过单独缓存100,000列表项,但需要大量的7秒钟以上 - 大部分的时间都花在取储存的项目。

有没有存储在请求之间存储的大名单一个便捷的方式? 你能想到的另一种方式我Django应用程序缓存使用的对象?

Answer 1:

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

-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)


Answer 2:

我不能添加评论,但我想分享解决此问题我速战速决,因为我有蟒蛇,memcached的行为出现异常,当你改变了同样的问题SERVER_MAX_VALUE_LENGTH在导入时。

那么,除了__init__是FizxMike建议你还可以在同一类编辑_cache属性编辑。 这样做可以实例化的python-的memcached客户端传递server_max_value_length明确的,就像这样:

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

感谢在此线程的所有帮助!



文章来源: Django caching a large list