arc*_*lus 64
如果您的问题是"由大量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 * <number of nodes>4Gb * <number of fragments>.(遗憾的是,如果你将你的表分段,那么你必须修改你的表访问代码mnesia:activity/4而不是mnesia:write和朋友一起使用,但是如果你提前计划它是可管理的)当涉及到类型表时,这个答案与现有的两个答案相矛盾disc_copies.让我首先得到一些一般性的观点:
ram_copies仅受可用RAM的限制(除非您使用的是32位计算机).数据存储在ETS表中.disc_only_copies存储在Dets表中.由于文件格式的限制,Dets表限制为2 GB.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.
Run Code Online (Sandbox Code Playgroud)
特别是,请查看差异以获取更多详细信息.mnesia_lib.erlmnesia_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
Run Code Online (Sandbox Code Playgroud)
它是有意义的,因为它是在改变前两年写的.
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分钟,转储需要一段时间,但在后台运行非常好.)
混淆似乎源于官方消息来源缺失或过时的信息:
LYSE似乎是第一个提到disc_copies不受Dets表大小限制的表的"权威"来源.