首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存302MB的对象

缓存302MB的对象
EN

Stack Overflow用户
提问于 2011-04-13 21:30:51
回答 4查看 4K关注 0票数 5

我有一个302MB的对象(实际上是一个对象数组)。当我尝试用memcached缓存它时,不管我给memcached多少内存,它都不起作用,显然是因为memcached对它可以缓存的对象有1MB的限制。(关于最后一部分,我可能是错的。我还没有找到很好的文档。)

对如何缓存这个东西有什么建议吗?我在Linux上使用PHP/symfony。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-13 21:34:57

Quoting

15.5.5.4:可以在memcache中存储的对象的最大大小是多少,这是可配置的吗?

默认最大对象大小为1MB。在memcached 1.4.2和更高版本中,可以使用-I命令行选项更改对象的最大大小。

对于之前的版本,要增加这个大小,必须重新编译memcached。您可以在源代码的slabs.c文件中修改POWER_BLOCK的值。

在memcached 1.4.2和更高版本中,可以使用-I命令行选项配置支持的最大对象大小。例如,要将最大对象大小增加到5MB:

$ memcached -I 5m

然而,即使在增加内存时,这也不是一个好的选择。一个更好的想法是将对象拆分成更小的部分,然后缓存其中的单独部分。

引用Why are items limited to 1 megabyte in size?

简短回答:因为内存分配器的算法是如何工作的。

长答案:Memcached的内存存储引擎(将来是可插拔的/可调整的……),使用slabs方法进行内存管理。内存被分解成不同大小的分片块,从最小的数字开始,以阶乘的方式递增到可能的最大值。

假设最小值为400字节,最大值为1兆字节,阶乘为1.20:

切片1- 400字节切片2- 480字节切片3- 576字节...等。

板越大,它与前一个板之间的间隙就越大。所以最大值越大,内存存储的效率就越低。Memcached还必须为存在的每个分片预先分配一些内存,因此设置一个较小的阶乘和较大的最大值将需要更多的开销。

你不想这么做还有其他原因...如果我们讨论的是一个网页,而你却试图存储/加载这么大的值,那么你可能做错了什么。在这种大小下,将数据结构加载并解压缩到内存中将需要相当长的时间,而且您的站点可能不会有很好的性能。

如果你真的想存储大于1MB的项,你可以使用编辑过的malloc值重新编译memcached,或者使用低效的slabs.c:POWER_BLOCK /free后端。其他建议包括数据库、MogileFS等。

票数 13
EN

Stack Overflow用户

发布于 2015-03-24 16:01:01

或者,您可以通过编辑配置文件/etc/memcached.conf来快速更改限制,添加:

代码语言:javascript
复制
# Increase limit 
-I 512M

在重新启动您的服务之后。

票数 1
EN

Stack Overflow用户

发布于 2011-04-13 21:33:27

您不可能需要一个对象(或对象数组)的302Mb实例进行缓存。

在没有看到代码的情况下,我不能建议how...but必须有一种很好的重构方法,以便在较小的规模上进行缓存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5650085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档