5

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

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

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

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

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

4

2 回答 2

9

编辑项目大小限制为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)
于 2013-03-13T11:04:40.663 回答
4

我还不能添加评论,但我想分享我对这个问题的快速修复,因为当你更改SERVER_MAX_VALUE_LENGTHat import 时间时,python-memcached 的行为异常我遇到了同样的问题。

好吧,除了__init__FizxMike 建议的编辑之外,您还可以在同一类中编辑 _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

感谢您对此线程的所有帮助!

于 2014-01-23T15:33:24.120 回答