2011-04-13 106 views
5

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

有关如何缓存这件事的任何建议吗?我在Linux上使用PHP/symfony。

+0

这是怎么回事?这似乎相当巨大! – 2011-04-13 13:32:18

+2

将它缓存在文件系统而不是memcache中,或者单独缓存阵列中的每个元素 – nos 2011-04-13 13:33:28

+0

缓存和320MB ... whooooooooooooooooooooooop – diEcho 2011-04-13 13:33:37

回答

12

Quoting

15.5.5.4:什么是一个对象,你可以在内存缓存中存储的最大尺寸,并且是可配置的?

默认的最大对象大小为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的内存存储引擎(这将是可插拔/在未来的调整...),采用的是地砖的方法来管理内存。内存被分解成不同大小的块,从最小数量开始,并按阶乘上升到最大可能值。

说最小值为400个字节,并且最大值为1兆字节,并且阶乘是1.20:

板坯1 - 400字节板坯2 - 480字节板3 - 576字节...等

板坯越大,它与前一块板之间的间隙越大。所以最大值越大,内存存储效率越低。 Memcached还必须为存在的每个板坯预分配一些内存,因此设置一个更大的最大值的factorial需要更多的开销。

还有一些其他原因,你不想这样做...如果我们谈论的是一个网页,你试图存储/负载值那么大,你可能做错事。在这个尺寸下,它将花费大量的时间来加载和解压缩数据结构到内存中,并且您的网站可能不会很好地运行。

如果您确实想要存储大于1MB的项目,则可以使用编辑好的slabs.c:POWER_BLOCK值重新编译memcached,或者使用效率低下的malloc/free后端。其他建议包括数据库,MogileFS等。

-1

有没有办法,你应该需要缓存一个对象(或对象数组)的302Mb实例。

没有看到代码,我不能建议如何......但必须有一个重构的好方法,以便您在较小规模上进行缓存。

0

你也许可以使用共享内存(但是我会投票反对它)或使用RAM驱动器。

这是为一个网络服务器,或者你正在寻找一个共同的缓存多个Web服务器?

当他们说你可能需要另一种方法时,我仍然加入其他人。试着解释你想要缓存什么样的数据。

1

在替代您可以通过编辑迅速改变限制配置文件[/etc/memcached.conf]加:

# Increase limit 
-I 512M 

重新启动服务后。