Mnesia 数据库的存储容量是多少?
有些地方规定2GB期限。 有些地方指出这取决于节点的数量。
Some places state 2GB period. Some places state it depends up the number of nodes.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
有些地方规定2GB期限。 有些地方指出这取决于节点的数量。
Some places state 2GB period. Some places state it depends up the number of nodes.
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
如果您的问题是“由大量
disc_only_copies
表组成的 mnesia 数据库的存储容量是多少”,那么这个容量就相当大了 - 您很大程度上受到可用磁盘空间的限制。一个更容易回答的问题是不同类型的单个 mnesia 表的最大容量是多少。
ram_copies
表受可用内存的限制。disc_copies
表受到其dets
后端的限制 (Hakan Mattsson 谈 Mnesia) - 目前数据限制为 4Gb。因此,简单的答案是,简单的
disc_copies
表在遇到问题之前最多可以存储 4Gb 的数据。 (如果超过磁盘大小限制,Mnesia 实际上不会崩溃 - 表的 ram_copies 部分继续运行,因此您可以通过删除数据或在运行时进行其他安排来修复此问题)但是,如果如果你考虑其他记忆功能,那么答案就更复杂了。
local_content
表。 如果表是一个
local_content
表,那么它可以有不同的内容
在 mnesia 集群的每个节点上,
所以桌子的容量是
4Gb * <节点数量>
4Gb * <分段数>
。 (遗憾的是,如果您对表进行分段,则必须修改表访问代码以使用mnesia:activity/4
而不是mnesia:write
等,但是如果您提前计划,这是可以管理的)Quite large if your question is "what's the storage capacity of an mnesia database made up of a huge number of
disc_only_copies
tables" - you're largely limited by available disk space.An easier question to answer is what's the maximum capacity of a single mnesia table of different types.
ram_copies
tables are limited by available memory.disc_copies
tables are limited by theirdets
backend (Hakan Mattsson on Mnesia) - this limit is 4Gb of data at the moment.So the simple answer is that simple
disc_copies
table can store up to 4Gb of data before they run into problems. (Mnesia doesn't actually crash if you exceed the on-disk size limit - the ram_copies portion of the table continues running, so you can repair this by deleting data or making other arrangements at runtime)However if you consider other mnesia features, then the answer is more complicated.
local_content
tables. If thetable is a
local_content
table,then it can have different contents
on each node in the mnesia cluster,
so the capacity of the table is
4Gb * <number of nodes>
4Gb * <number of fragments>
. (Sadly if you fragment your table, you then have to modify your table access code to usemnesia:activity/4
instead ofmnesia:write
and friends, but if you plan this in advance it's managable)TL;DR:Mnesia 数据库的存储容量仅受*可用 RAM 的限制。
* 假设您使用表类型
ram_copies
或disc_copies
。 此外,如果您在disc_copies
表中存储大量数据,则需要在启动时从磁盘读取数据,这可能会增加启动时间,超出可接受的范围。当涉及
disc_copies
类型的表时,这个答案与两个现有答案相矛盾。 首先让我澄清一些一般性的观点:ram_copies
类型的 mnesia 表仅受可用 RAM 的限制(除非您使用的是 32 位机器)。 数据存储在 ETS 表中。disc_only_copies
类型的 mnesia 表存储在 Dets 表中。 由于文件格式的限制,Dets 表的大小限制为 2 GB。disc_copies
类型的 mnesia 表既存储在 RAM 中,又存储在磁盘上,因此它受到可用 RAM 的限制 - 也许还有其他原因?我将在下面尝试说明 Mnesia 对
disc_copies
表的大小没有施加具体限制。 但请注意,许多 Erlang 程序员认为disc_copies
表的大小限制为 2 GB。 这个问题的已接受的答案中对此进行了说明,在撰写本文时,该答案的得分是该答案的 7 倍。2001 年,disc_copies 从 dets 移至 disk_log
人们普遍认为
disc_copies
表由 Dets 表支持。 据我所知,这种情况一直持续到 Erlang/OTP R7B-4(2001 年 9 月 30 日发布)为止。 来自自述文件:查看差异 了解更多详细信息,特别是
mnesia_lib.erl
和 mnesia_loader。呃。支持 dets 和 2 / 4 GB 限制的来源
archelaus 的答案来自 http://erlang.org/~hakan/mnesia_conspiration.txt,它解释了
disc_copies
表驻留在 ets 和dets 表。 然而,查看目录索引,我们发现该文档的日期为 1999 年:这是有道理的它会这样说,因为它是在改变之前两年写的。
Ray Boosen 的回答来自 Erlang 常见问题解答:
FAQ 至少从 2001 年 1 月起就一直这么说(参见 Wayback Machine 中最早的副本)。 这意味着此常见问题解答条目的日期是在切换到 disk_log 之前,并且已经很长时间没有更新了。 (无论如何,Dets 表大小限制是 2 GB,而不是 4 GB。)我提交了 a常见问题解答的拉取请求。
支持更高限制的来源
Mnesia 的 Learn You Some Erlang 章节 说:
我不确定这是什么时候写的,但是上面的文本存在于 最早的 Wayback Machine 副本,日期为 2012 年 4 月。
在 一篇关于 erlang 问题的帖子,题为“击败 mnesia 至死(是 RE:在 Erlang VM 中使用 4Gb 内存)”,日期为 2005 年 11 月 7 日,Ulf Wiger 写道:
限制
混乱似乎源于官方来源的信息缺失或过时:
LYSE 似乎是第一个提到
disc_copies
表不受 Dets 表大小限制。TL;DR: the storage capacity of a Mnesia database is limited only* by available RAM.
* Assuming you use table types
ram_copies
ordisc_copies
. Also, if you store a lot of data in adisc_copies
table, it needs to be read from disk at startup, which might increase startup time beyond what's acceptable.This answer contradicts the two existing answers when it comes to tables of type
disc_copies
. Let me first get a few general points out of the way:ram_copies
is only limited by available RAM (except if you're on a 32-bit machine). Data is stored in an ETS table.disc_only_copies
is stored in a Dets table. Dets tables are limited to 2 GB, because of limits in the file format.disc_copies
is stored both in RAM and on disk, so it is limited by available RAM - and perhaps something else?I'm going to try to show below that there is no specific limit imposed by Mnesia on the size of a
disc_copies
table. Note however that many Erlang programmers believe thatdisc_copies
tables are limited to 2 GB. That is stated in the accepted answer to this question, which at the time of writing outscores this answer by a factor of 7.disc_copies moved from dets to disk_log in 2001
It is commonly believed that
disc_copies
tables are backed by Dets tables. As far as I can tell, this was the case until Erlang/OTP R7B-4 (released on 30th September 2001). From the README:Look at the diff for more details, in particular
mnesia_lib.erl
andmnesia_loader.erl
.Sources supporting dets and a 2 / 4 GB limit
archelaus's answer draws from http://erlang.org/~hakan/mnesia_consumption.txt, which explains that
disc_copies
tables reside in ets and dets tables. However, looking at the index for the directory, we see that this document is dated 1999:It makes sense that it would say this, as it was written two years before the change.
Ray Boosen's answer draws from the Erlang FAQ:
The FAQ has been saying that since at least January 2001 (see the earliest copy in the Wayback Machine). That means that this FAQ entry dates from before the switch to disk_log, and hasn't been updated for a long time. (Anyway, the Dets table size limit is 2 GB, not 4 GB.) I submitted a pull request for the FAQ.
Sources supporting higher limits
The Learn You Some Erlang chapter on Mnesia says:
I'm not sure when this was written, but the text above exists in the earliest Wayback Machine copy, dated April 2012.
In a post on erlang-questions titled "beating mnesia to death (was RE: Using 4Gb of ram with Erlang VM)", dated 7th November 2005, Ulf Wiger writes:
Conclusions
The confusion seems to stem from missing or out-dated information from official sources:
LYSE seems to be the first "authoritative" source that mentions
disc_copies
tables not being subject to the Dets table size limit.根据文档,这是 4GB。 第 11.5 节
http://erlang.org/faq/mnesia.html
As per the documentation, this is 4GB. Section 11.5
http://erlang.org/faq/mnesia.html