使用memcache.py可以在memcached中保存的最大对象大小

时间:2009-09-17 19:00:13

标签: python memcached limit

我需要向用户返回一个相当大的文件(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)

7 个答案:

答案 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

http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_%281_megabyte%29

更新:这是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,它声称的内存将仅用于该单个文件,如果你只是依赖于操作系统的缓存,内存可以用于各种目的,具体取决于作业在手边。