我需要向用户返回一个相当大的文件(11MB)。出于某些原因,我不能只提供文件的直接网址(http://www.sample.com/mybigfile.exe);相反,它必须通过代码访问。
我不是一遍又一遍地从磁盘上读取它,而是想把它保存在memcached中(如果这不是一个好主意,请告诉我)。一切似乎都很好(没有错误),但是当我尝试从memcached中检索文件时,我总是得到None,好像文件没有被缓存一样。
可以保存的是否有尺寸限制?
以下是代码:
def download_demo():
"""
Returns the demo file
"""
KEY = "xyz"
TIME = 86400 #24 hours
buff = memc.get(KEY)
if not buff:
file = open(FILENAME, 'r')
buff = file.read()
memc.set(KEY, buff, TIME)
print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" % (os.path.split(FILENAME)[-1], len(buff), buff)
答案 0 :(得分:33)
从memcache 1.4.2开始,这是一个用户可配置的参数:ReleaseNotes142 * memcached @ Github
可配置的最大项目大小
许多人要求memcached能够存储更大的物品 超过1MB,而通常建议一个不这样做,它是 现在支持命令行。
一些开明的民众也要求memcached减少 最大物品尺寸。这也是一种选择。新的-I参数允许您指定最大项目大小 运行。它支持单位后缀以允许自然表达 项目大小。
示例:
memcached -I 128k # Refuse items larger than 128k. memcached -I 10m # Allow objects up to 10MB
答案 1 :(得分:31)
memcached FAQ中有两个条目:
第一个答案是(引用,强调我的):
您可以使用的最大值 memcached中的商店是1兆字节。如果 考虑到你的数据更大 客户端压缩或拆分 将值放到多个键中。
所以我猜你的11MB文件太大了,无法放入一个memcached条目。
根据其他答案,可以增加对象的大小。
答案 2 :(得分:22)
总结必要的步骤:
1)将Memcache更新到1.4.2或更高版本。
2)将标志-I 15M(或多兆字节)添加到memcache运行命令中。
这是命令行,或者在Ubuntu中添加行
-I 15M
到/etc/memcached.conf中的任意位置并重启服务。
3)在memcache中向客户端添加必要的标志。
import memcache
memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15)
memc.set(KEY, buff, TIME)
如果您没有直接访问memcache客户端(即通过框架工作),那么只需直接破解内存缓存代码。
在Ubuntu上,它是/usr/local/lib/python2.7/dist-packages/memcache.py。改变这一行:
SERVER_MAX_ITEM_LENGTH = 1024 * 1024
到
SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15
显然,如果你更新内存缓存,你需要再次进行这种黑客攻击,但这是一个非常简单快速的修复。
答案 3 :(得分:2)
每个项目的最大数据大小为1mb
更新:这是2009年的答案。在那个日期,信息是准确的,来源是官方的。现在在2014年,memcached可以存储128mb而不是1mb(但开发人员并不打算更新官方常见问题解答)。有人可以找到唯一一个可能会在一年内死亡的模糊页面。
答案 4 :(得分:1)
以下文章解释了为什么它将单个文件的最大大小限制为1M。
http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/
基本上,memcache中有一小块内存页面,其中包含对象。
默认页面大小似乎是1M,因此页面可以包含的最大对象限制为1M。
即使您可以将其配置为增加大小,但我认为这可能会有某种性能权衡。
答案 5 :(得分:1)
如果您使用的是python memcached客户端,请确保在客户端memcache.py文件中增加限制以及memcached服务器。
〜/安纳康达/ LIB / python2.7 /站点包/ memcache.py
SERVER_MAX_KEY_LENGTH = 250
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15
你可以在memcached控制台(telnet localhost 11211)中看到
stats slabs STAT 48:chunk_size 3677344
答案 6 :(得分:1)
似乎没有人解决这部分问题:
我不想一遍又一遍地从磁盘中读取它,而是想把它保存在memcached中(如果这不是个好主意,请告诉我。)
这不是一个好主意。所有现代文件系统都具有高效的缓存机制。从几秒钟前读取的磁盘读取文件通常仍在内存缓存中。这比通过网络访问memcached快得多。
如果你在127.0.0.1上运行memcached,它声称的内存将仅用于该单个文件,如果你只是依赖于操作系统的缓存,内存可以用于各种目的,具体取决于作业在手边。