我有一个302MB的对象(实际上是一个对象数组)。当我尝试用memcached缓存它时,它不起作用,无论我给memcached多少内存,显然是因为memcached对可以缓存的对象有1MB的限制。 (我可能是错的最后一部分,我一直没有找到很好的文档。)缓存一个302MB对象
有关如何缓存这件事的任何建议吗?我在Linux上使用PHP/symfony。
我有一个302MB的对象(实际上是一个对象数组)。当我尝试用memcached缓存它时,它不起作用,无论我给memcached多少内存,显然是因为memcached对可以缓存的对象有1MB的限制。 (我可能是错的最后一部分,我一直没有找到很好的文档。)缓存一个302MB对象
有关如何缓存这件事的任何建议吗?我在Linux上使用PHP/symfony。
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等。
有没有办法,你应该需要缓存一个对象(或对象数组)的302Mb实例。
没有看到代码,我不能建议如何......但必须有一个重构的好方法,以便您在较小规模上进行缓存。
你也许可以使用共享内存(但是我会投票反对它)或使用RAM驱动器。
这是为一个网络服务器,或者你正在寻找一个共同的缓存多个Web服务器?
当他们说你可能需要另一种方法时,我仍然加入其他人。试着解释你想要缓存什么样的数据。
在替代您可以通过编辑迅速改变限制配置文件[/etc/memcached.conf]加:
# Increase limit
-I 512M
重新启动服务后。
这是怎么回事?这似乎相当巨大! – 2011-04-13 13:32:18
将它缓存在文件系统而不是memcache中,或者单独缓存阵列中的每个元素 – nos 2011-04-13 13:33:28
缓存和320MB ... whooooooooooooooooooooooop – diEcho 2011-04-13 13:33:37