Django缓存一个大列表
我的django应用程序处理25MB的二进制文件。它们每个都有大约100000条256字节的“记录” 从磁盘读取二进制文件并使用python的struct模块对其进行解码大约需要7秒钟。我将数据转换成一个大约100000个项目的列表,其中每个项目都是一个字典,包含各种类型的值(浮点、字符串等) 我的django视图需要在此列表中搜索。显然7秒太长了 我曾尝试使用django的低级缓存API来缓存整个列表,但这行不通,因为任何单个缓存项的最大大小限制都是1MB。我尝试过单独缓存100000个列表项,但这需要7秒以上的时间——大部分时间都花在取消勾选这些项上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应用程序使用吗?编辑项目大小限制为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修复了它。