32

我需要向用户返回一个相当大的文件(11MB)。由于某些原因,我不能只提供文件的直接 url ( 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)
4

7 回答 7

40

从 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
于 2012-07-30T22:22:29.137 回答
39

memcached FAQ中有两个关于此的条目:

第一个的答案是(引用,强调我的)

您可以存储在 memcached 中的值的最大大小为 1 兆字节。如果您的数据较大,请考虑客户端压缩或将值拆分为多个键。

所以我猜你的 11MB 文件太大了,无法放入一个 memcached 条目中。

根据其他答案,可以增加对象的大小。

于 2009-09-17T19:07:28.087 回答
23

总结必要的步骤:

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 客户端(即通过框架工作),那么只需直接破解 memcache 代码。

在 Ubuntu 上,它是 /usr/local/lib/python2.7/dist-packages/memcache.py。换行:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

显然,如果您更新 memcache,您将需要再次执行此 hack,但这是一个非常简单且快速的修复。

于 2013-08-12T08:32:25.627 回答
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(但开发人员并没有费心更新官方常见问题解答)。唯一可以找到的参考是一个晦涩难懂的页面,可能会在一年内消失。

于 2009-09-17T19:06:35.240 回答
1

以下文章解释了为什么它将单个文件的最大大小限制为 1M。

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

基本上,内存缓存中有一小块内存页面,对象驻留在其中。

并且默认的页面大小似乎是1M,所以一个页面可以包含的最大对象被限制为1M。

即使您可以对其进行配置以增加大小,但我认为这可能会带来某种性能权衡。

于 2015-05-06T12:16:58.917 回答
1

似乎没有人解决这部分问题:

我不必一遍又一遍地从磁盘读取它,而是考虑将它保存在 memcached 中(如果这不是一个好主意,请告诉我)。

这不是一个好主意。所有现代文件系统都有高效的缓存机制。从磁盘读取几秒钟前读取的文件通常仍位于内存缓存中。这比通过网络访问 memcached 快得多。

如果您在 127.0.0.1 上运行 memcached,则它声称的内存将仅用于该单个文件,如果您仅依赖操作系统的缓存,则内存可用于各种用途,具体取决于手头的工作。

于 2016-11-17T13:28:20.563 回答
1

如果您使用的是 python memcached 客户端,请确保增加客户端 memcache.py 文件中的限制以及 memcached 服务器。

~/anaconda/lib/python2.7/site-packages/memcache.py

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

您可以在 memcached 控制台中看到( telnet localhost 11211 )

统计平板 STAT 48:chunk_size 3677344

于 2016-06-24T02:26:44.713 回答