缓存302MB对象

Jas*_*ett 5 php caching

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

关于如何缓存这个东西的任何建议?我在Linux上使用PHP/symfony.

Gor*_*don 12

引用

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
Run Code Online (Sandbox Code Playgroud)

然而,即使增加内存,这也不是IMO的好选择.更好的想法是将对象分成更小的部分,然后缓存它的单个部分.

引用为什么项目大小限制为1兆字节?

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

答案很长:Memcached的内存存储引擎(将来可插拔/调整......)使用slab方法进行内存管理.存储器被分解成不同大小的块状块,从最小数量开始并以阶乘方式上升到最大可能值.

假设最小值为400字节,最大值为1兆字节,因子为1.20:

slab 1 - 400 bytes slab 2 - 480 bytes bytes slab 3 - 576 bytes ...等

板坯越大,它与前一块板坯之间的间隙就越大.因此,最大值越大,存储器存储的效率越低.Memcached还必须为每个存在的slab预分配一些内存,因此设置一个较小的factor并使用较大的max值将需要更多的开销.

还有其他原因你不想这样做......如果我们谈论的是一个网页而你试图存储/加载大的值,你可能做错了.在这个大小的情况下,将数据结构加载和解压缩到内存中需要花费相当多的时间,并且您的站点可能无法很好地执行.

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