我有一个302MB的对象(实际上是一个对象数组)。当我尝试用memcached缓存它时,不管我给memcached多少内存,它都不起作用,显然是因为memcached对它可以缓存的对象有1MB的限制。(关于最后一部分,我可能是错的。我还没有找到很好的文档。)
对如何缓存这个东西有什么建议吗?我在Linux上使用PHP/symfony。
发布于 2011-04-13 21:34:57
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等。
发布于 2015-03-24 16:01:01
或者,您可以通过编辑配置文件/etc/memcached.conf来快速更改限制,添加:
# Increase limit
-I 512M在重新启动您的服务之后。
发布于 2011-04-13 21:33:27
您不可能需要一个对象(或对象数组)的302Mb实例进行缓存。
在没有看到代码的情况下,我不能建议how...but必须有一种很好的重构方法,以便在较小的规模上进行缓存。
https://stackoverflow.com/questions/5650085
复制相似问题