我曾经在全局变量中缓存数据库查询以加速我的应用程序。由于这是强烈的未经修改(它确实产生了问题),我想使用任何类型的Django缓存。我尝试了LocMemCache和DatabaseCache,但两者都需要......大约 15秒来设置我的变量(比生成数据需要的时间长两倍,大小为7MB)。
这是预期的吗?我做错了吗?
(Memcached限制为1MB,我无法拆分我的数据,其中包含任意大的二进制掩码)。
编辑:FileBasedCache也需要30秒才能设置。
Settings.py:
CACHES = {
'default': {...},
'stats': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
# or 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'stats',
},
}
Service.py:
from django.core.cache import caches
def stats_service():
stats_cache = caches['stats']
if stats_cache.get('key') is None:
stats_cache.set('key', data) # 15s with DatabaseCache, 30s with LocMemCache
return stats_cache.get('key')
全局变量(超快)版本:
_cache = {}
def stats_service():
if _cache.get('key') is None:
_cache['key'] = data
return _cache['key']
答案 0 :(得分:2)
一种选择可能是使用diskcache.DjangoCache。 DiskCache扩展了Django缓存API,以支持按原样写入和读取二进制流(避免酸洗)。它对于大值(例如大于1MB的值)特别有效。 DiskCache是一个Apache2许可磁盘和file backed cache library,用纯Python编写,与Django兼容。
在您的情况下,您可以使用ndarray tostring和numpy fromstring方法快速转换为Python字符串/从Python字符串转换。然后用io.StringIO包装字符串以在缓存中存储/检索。例如:
from django.core.cache import cache
value = cache.get('cache-key', read=True)
if value:
data = numpy.fromstring(value.read())
value.close()
else:
data = ... # Generate 7MB array.
cachge.set('cache-key', io.StringIO(data.tostring()), read=True)
DiskCache通过允许类似文件的值扩展Django缓存API,这些值作为二进制blob存储在磁盘上。 Django cache benchmarks页面讨论并比较了备用缓存后端。
答案 1 :(得分:0)
此代码段实际上运行正常:https://djangosnippets.org/snippets/2396/
据我所知,使用全局变量进行缓存的the only problem是线程安全的,这个no-pickle版本是线程安全的。