Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django缓存一个大列表_Django_Caching_Memcached_Deserialization_Pickle - Fatal编程技术网

Django缓存一个大列表

Django缓存一个大列表,django,caching,memcached,deserialization,pickle,Django,Caching,Memcached,Deserialization,Pickle,我的django应用程序处理25MB的二进制文件。它们每个都有大约100000条256字节的“记录” 从磁盘读取二进制文件并使用python的struct模块对其进行解码大约需要7秒钟。我将数据转换成一个大约100000个项目的列表,其中每个项目都是一个字典,包含各种类型的值(浮点、字符串等) 我的django视图需要在此列表中搜索。显然7秒太长了 我曾尝试使用django的低级缓存API来缓存整个列表,但这行不通,因为任何单个缓存项的最大大小限制都是1MB。我尝试过单独缓存100000个列表项

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

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

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

我曾尝试使用django的低级缓存API来缓存整个列表,但这行不通,因为任何单个缓存项的最大大小限制都是1MB。我尝试过单独缓存100000个列表项,但这需要7秒以上的时间——大部分时间都花在取消勾选这些项上


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

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

转到/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)
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

我还不能添加注释,但我想与大家分享一下我对这个问题的快速解决方法,因为在导入时更改
服务器\u MAX\u VALUE\u LENGTH
时,python memcached的行为也会出现同样的问题

好的,除了FizxMike建议的
\uuuuu init\uuuuu
编辑之外,您还可以在同一个类中编辑cache属性。这样,您可以实例化python memcached客户端,显式地传递
服务器\u max\u value\u length
,如下所示:

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)
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
我还更喜欢创建另一个从BaseMachedCache继承的后端,并使用它而不是编辑django代码

以下是django memcached后端模块供参考:


谢谢你在这个帖子上的帮助

使用numpy.array可能吗?你考虑过使用数据库吗?James R:我看不到numpy.array和我的缓存问题之间的联系。Ignacio:是的,这可能会奏效——我会将100000个项目中的每一个存储为django模型实例,并使用ORM调用后续请求中的数据。。。但我希望找到一个更简单的基于内存的解决方案。numpy.array在存储大型数字数组时更有效。如果你不存储数字,它也不是有用的东西,如果它是平的,你应该考虑使用蒙哥或卡桑德拉。当然,这是Ubuntu 12.04 LTS…文件位置可能因发行版而异。只是浪费了几个小时来解决这个问题。。。不知道是memcache还是Django造成的,然后意识到两者都有!实际上,由于python memcache的意外行为,这对我不起作用,我刚刚报道了这一点。看,这对我也不管用。我用pylibmc而不是pythonmemcache修复了它。