有些地方表示2GB期间。有些地方说它取决于节点的数量。
答案 0 :(得分:62)
如果您的问题是“由大量disc_only_copies
表组成的mnesia数据库的存储容量是多少”,那么你会很大 - 你很大程度上受到可用磁盘空间的限制。
更容易回答的问题是,不同类型的单个mnesia表的最大容量是多少。 ram_copies
表受可用内存的限制。 disc_copies
表受dets
后端(Hakan Mattsson on Mnesia)限制 - 此限制目前为4Gb数据。
所以简单的答案就是简单的disc_copies
表在遇到问题之前可以存储多达4Gb的数据。 (如果超过磁盘大小限制,Mnesia实际上不会崩溃 - 表的ram_copies部分继续运行,因此您可以通过删除数据或在运行时进行其他安排来修复此问题) p>
但是如果你考虑其他的mnesia功能,那么答案会更复杂。
local_content
表。如果
table是local_content
表,
那么它可以有不同的内容
在mnesia集群中的每个节点上,
所以表的容量是
4Gb * <number of nodes>
4Gb * <number of fragments>
。 (可悲的是,如果您将表格分段,则必须修改表格访问代码以使用mnesia:activity/4
代替mnesia:write
和朋友,但如果您事先计划好这是可管理的 )答案 1 :(得分:9)
当涉及到disc_copies
类型的表时,这个答案与现有的两个答案相矛盾。首先让我先谈谈几点:
ram_copies
的mnesia表仅受可用RAM的限制(除非您使用的是32位计算机)。数据存储在ETS表中。disc_only_copies
的mnesia表存储在Dets表中。由于文件格式的限制,Dets表限制为2 GB。disc_copies
的mnesia表存储在中存储在RAM和磁盘上,因此它受可用内存限制 - 可能还有其他内容?我将尝试在下面显示Mnesia对disc_copies
表的大小施加的 no 特定限制。但请注意,许多Erlang程序员认为disc_copies
表限制为2 GB。这个问题在the accepted answer中有说明,在撰写本文时,这个问题的得分超过了7倍。
通常认为disc_copies
表由Dets表支持。据我所知,直到Erlang / OTP R7B-4(2001年9月30日发布)才是这种情况。来自the README:
-- mnesia -----------------------------------------------------------------
OTP-3712 - Speed/load improvements disc_copies tables are not
implemented with dets anymore.
请查看the diff了解详情,尤其是mnesia_lib.erl
和mnesia_loader.erl
。
archelaus's answer来自http://erlang.org/~hakan/mnesia_consumption.txt,这解释了disc_copies
表位于ets和dets表中。但是,看the index for the directory,我们看到这份文件的日期是1999年:
[TXT] mnesia_consumption.txt 26-Oct-1999 10:57 10k
它是有意义的,因为它是在改变前两年写的。
Ray Boosen's answer来自the Erlang FAQ:
11.5在Mnesia中可以存储多少数据?
Dets使用32位整数进行文件偏移,因此最大可能的mnesia表(现在)是4Gb。
实际上,在达到此限制之前,您的机器会慢慢爬行。
常见问题解答已经说过,至少从2001年1月开始(见the earliest copy in the Wayback Machine)。这意味着此FAQ条目的日期是从切换到disk_log之前的日期,并且很长时间没有更新。 (无论如何,Dets表的大小限制为2 GB,而不是4 GB。)我提交了a pull request来解决常见问题。
The Learn You Some Erlang chapter on Mnesia说:
<强> ram_copies 强>
这个选项使得所有数据都只存储在ETS中,因此只有内存。对于以32位编译的虚拟机,内存应限制在理论上4GB(实际上约为3GB),但假设可用内存超过4GB,这个限制会在64位虚拟机上进一步推迟。<强> disc_only_copies 强>
此选项表示数据仅存储在DETS中。仅限光盘,因此存储仅限于DETS的2GB限制。<强> disc_copies 强>
此选项意味着数据既存储在ETS中又存储在磁盘上,因此存储器和硬盘都存储在内。 disc_copies表不受DETS限制的限制,因为Mnesia使用复杂的事务日志和检查点系统,允许在内存中创建表的基于磁盘的备份。
我不确定这是什么时候编写的,但上面的文字存在于2012年4月的earliest Wayback Machine copy中。
在2005年11月7日的a post on erlang-questions titled "beating mnesia to death (was RE: Using 4Gb of ram with Erlang VM)"中,Ulf Wiger写道:
在16 GB的计算机上,您可以:
同时运行600万个进程 (通过使用erlang:hibernate,我实际上是 能够运行2000万 - 产卵时间:6.3 us, 消息传递时间:5.3我们,我有 1.8 GB备用。)
使用至少12 GB的数据填充mnesia,但是 想想你想要如何表达它,因为 64位的字大小会让事情变得更糟。
在mnesia中保留一个10 GB + disc_copy表。该 加载时间和日志转储成本似乎可以接受 (加载10分钟,倾倒需要一段时间,但是 很好地在后台运行。)
混淆似乎源于官方消息来源缺失或过时的信息:
LYSE似乎是第一个提及disc_copies
表格不受Dets表格大小限制的“权威”来源。
答案 2 :(得分:7)
根据文档,这是4GB。第11.5节