有些地方国家2GB期间.有些地方表示它取决于节点数量.
如果您的问题是"由大量disc_only_copies
表格组成的mnesia数据库的存储容量是多少",那么您将受到很大限制 - 您在很大程度上受可用磁盘空间的限制.
一个更容易回答的问题是,不同类型的单个mnesia表的最大容量是多少.ram_copies
表格受可用内存的限制.disc_copies
桌子受到dets
后端的限制(在Mnesia上的Hakan Mattsson) - 这个限制目前是4Gb的数据.
所以简单的答案就是简单的disc_copies
表可以在遇到问题之前存储多达4Gb的数据.(如果超过磁盘大小限制,Mnesia实际上不会崩溃 - 表的ram_copies部分继续运行,因此您可以通过删除数据或在运行时进行其他安排来修复此问题)
但是,如果你考虑其他的mnesia功能,那么答案就更复杂了.
local_content
表.如果表是一个local_content
表,那么它可以在mnesia集群中的每个节点上具有不同的内容,因此表的容量是
4Gb *
碎片表.Mnesia支持使用表碎片进行用户可配置的表分区或分片.在这种情况下,您可以通过许多基本表有效地分发和重新分配表中的数据.这些原始表可以各自具有自己的配置 - 例如一个ram_copies表和其余的disc_only_copies表.这些原始表具有与前面提到的相同的大小限制,现在分段表的有效容量是4Gb *
.(遗憾的是,如果你将你的表分段,那么你必须修改你的表访问代码mnesia:activity/4
而不是mnesia:write
和朋友一起使用,但是如果你提前计划它是可管理的)
外部副本如果您喜欢生活在最极端的边缘,您可以将mnesiaex补丁应用于mnesia并将您的表数据存储在外部系统(如Amazon S3或Tokyo Cabinet)中.在这种情况下,表的容量受后端存储的限制.
当涉及到类型表时,这个答案与现有的两个答案相矛盾disc_copies
.让我首先得到一些一般性的观点:
类型的mnesia表ram_copies
仅受可用RAM的限制(除非您使用的是32位计算机).数据存储在ETS表中.
类型的mnesia表disc_only_copies
存储在Dets表中.由于文件格式的限制,Dets表限制为2 GB.
绕过该限制的显而易见的方法是创建更多表,可能通过表碎片.
模式也存储在Dets表中,因此描述所有现有表的信息也限制为2 GB.但是,在你击中那个之前,你可能会遇到其他限制.
类型的一个Mnesia表disc_copies
存储都在RAM和磁盘上,因此它是可用RAM限制-也许是别的东西吗?
我将尝试在下面显示Mnesia对表的大小没有特定的限制disc_copies
.但请注意,许多Erlang程序员认为disc_copies
表限制为2 GB.在这个问题的公认答案中已经说明了这一点,在撰写本文时,这个答案的得分超过了7分.
通常认为disc_copies
表由Dets表支持.据我所知,直到Erlang/OTP R7B-4(2001年9月30日发布)才是这种情况.来自README:
-- mnesia -----------------------------------------------------------------
OTP-3712 - Speed/load improvements disc_copies tables are not
implemented with dets anymore.
特别是,请查看差异以获取更多详细信息.mnesia_lib.erl
mnesia_loader.erl
archelaus的回答来自http://erlang.org/~hakan/mnesia_consumption.txt,它解释了disc_copies
表位于ets和dets表中.但是,查看目录的索引,我们看到该文档的日期是1999年:
[TXT] mnesia_consumption.txt 26-Oct-1999 10:57 10k
它是有意义的,因为它是在改变前两年写的.
Ray Boosen的答案来自Erlang FAQ:
11.5 Mnesia可以存储多少数据?
Dets使用32位整数进行文件偏移,因此最大可能的mnesia表(现在)是4Gb.
实际上,在达到此限制之前,您的机器将慢慢爬行.
常见问题解答已经说过,至少从2001年1月开始(参见Wayback Machine中最早的副本).这意味着此FAQ条目的日期是从切换到disk_log之前的日期,并且很长时间没有更新.(无论如何,Dets表大小限制为2 GB,而不是4 GB.)我提交了常见问题解答的拉取请求.
关于Mnesia的Learn You Some Erlang章节说:
ram_copies
这个选项使得所有数据都只存储在ETS中,所以只有内存.对于以32位编译的虚拟机,内存应限制在理论上4GB(实际上约为3GB),但假设有超过4GB的可用内存,则该限制会在64位虚拟机上进一步推迟.disc_only_copies
此选项表示数据仅存储在DETS中.仅限光盘,因此存储仅限于DETS的2GB限制.disc_copies
此选项表示数据存储在ETS和磁盘上,因此内存和硬盘都存储在内.disc_copies表不受DETS限制的限制,因为Mnesia使用复杂的事务日志和检查点系统,允许在内存中创建表的基于磁盘的备份.
我不确定这是什么时候写的,但上面的文字存在于最早的Wayback Machine副本中,日期为2012年4月.
在上二郎山-问题后名为"跳动的Mnesia死亡(再次:使用使用Erlang VM的RAM 4GB)",7日2005年11月,乌尔夫Wiger写道:
结论在16 GB的计算机上,您可以:
运行600万个并发进程(通过使用erlang:hibernate,我实际上可以运行2000万 - 产生时间:6.3 us,消息传递时间:5.3 us,我有1.8 GB备用.)
用至少12 GB的数据填充mnesia,但要考虑你想要如何表示它,因为64位字大小会让事情变得更糟.
在mnesia中保留一个10 GB + disc_copy表.加载时间和日志转储成本似乎可以接受(加载10分钟,转储需要一段时间,但在后台运行非常好.)
混淆似乎源于官方消息来源缺失或过时的信息:
Mnesia文档未提及任何表大小限制
Erlang常见问题解答说Mnesia受到4 GB Dets大小的限制,但这个答案是在对disk_log进行更改之前编写的.
erlang.org域名上唯一的另一个文件是HåkanMattsson的文档,可以追溯到从disk_log更改之前
LYSE似乎是第一个提到disc_copies
不受Dets表大小限制的表的"权威"来源.
根据文档,这是4GB.第11.5节
http://erlang.org/faq/mnesia.html