34

有些地方规定2GB期限。有些地方说这取决于节点的数量。

4

3 回答 3

67

如果您的问题是“由大量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>
  • 零散的表。Mnesia 支持用户可配置的表分区或使用表碎片的分片。在这种情况下,您可以有效地将表中的数据分布和重新分布到多个原始表中。这些原始表都可以有自己的配置——比如一个 ram_copies 表和其余的 disc_only_copies 表。这些原始表的大小限制与前面提到的相同,现在碎片表的有效容量为4Gb * <number of fragments>. (可悲的是,如果您将表格分段,则必须修改您的表格访问代码以mnesia:activity/4代替mnesia:write和朋友使用,但如果您提前计划,它是可管理的
  • 外部副本如果您喜欢生活在最前沿,您可以将mnesiaex补丁应用到 mnesia 并将您的表数据存储在外部系统中,例如Amazon S3Tokyo Cabinet。在这种情况下,表的容量受到后端存储的限制。
于 2009-01-07T21:50:24.117 回答
13

TL;DR: Mnesia 数据库的存储容量仅受可用 RAM的限制

*假设您使用表类型ram_copiesdisc_copies. 此外,如果您在表中存储大量数据disc_copies,则需要在启动时从磁盘读取数据,这可能会增加启动时间,超出可接受的范围。


当涉及到类型表时,这个答案与现有的两个答案相矛盾disc_copies。让我首先提出一些一般性的观点:

  • 记忆表类型ram_copies仅受可用 RAM 的限制(除非您在 32 位机器上)。数据存储在 ETS 表中。
  • 类型的 mnesia 表disc_only_copies存储在 Dets 表中。由于文件格式的限制,Dets 表被限制为 2 GB。
  • 绕过该限制的明显方法是创建更多表,可能通过表碎片
  • 该模式也存储在 Dets 表中,因此描述所有现有表的信息也限制为 2 GB。不过,在达到其他限制之前,您可能会遇到其他限制。
  • 一个类型的记忆表disc_copies存储RAM 和磁盘上,所以它受到可用 RAM 的限制——也许还有别的东西?

我将尝试在下面展示Mnesia 对表格大小没有具体限制。disc_copies但是请注意,许多 Erlang 程序员认为disc_copies表被限制为 2 GB。这在该问题的公认答案中有所说明,在撰写本文时,该答案的得分比该答案高出 7 倍。


disc_copies 于 2001 年从 dets 移至 disk_log

通常认为disc_copies表是由 Dets 表支持的。据我所知,直到 Erlang/OTP R7B-4(2001 年 9 月 30 日发布)之前都是这种情况。从自述文件

  -- mnesia -----------------------------------------------------------------

        OTP-3712 - Speed/load improvements disc_copies tables are not 
                   implemented with dets anymore.

查看差异以获取更多详细信息,特别是mnesia_lib.erlmnesia_loader.erl


支持 dets 和 2 / 4 GB 限制的来源

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 月开始,FAQ 就一直这么说(参见Wayback Machine 中最早的副本)。这意味着这个FAQ条目的日期是在切换到disk_log之前,并且很长时间没有更新。(无论如何,Dets 表的大小限制是 2 GB,而不是 4 GB。)我提交了一个常见问题的拉取请求


支持更高限制的来源

关于 Mnesia 的 Learn You Some Erlang 章节说:

ram_copies
此选项使所有数据都专门存储在 ETS 中,因此仅存储在内存中。对于在 32 位上编译的虚拟机,内存应限制在理论上的 4GB(实际上约为 3GB),但在 64 位虚拟机上,假设有超过 4GB 的可用内存,这个限制会被推得更远。

disc_only_copies
此选项表示数据仅存储在 DETS 中。仅限光盘,因此存储仅限于 DETS 的 2GB 限制。

disc_copies
这个选项意味着数据既存储在 ETS 中,也存储在磁盘上,因此既存储在内存上,也存储在硬盘上。disc_copies 表不受 DETS 限制,因为 Mnesia 使用复杂的事务日志和检查点系统,允许在内存中创建基于磁盘的表备份。

我不确定这是什么时候写的,但上面的文字存在于最早的 Wayback Machine 副本中,日期为 2012 年 4 月。

Ulf Wiger在2005 年 11 月 7 日的一篇题为“将 mnesia 打死(RE: Using 4Gb of ram with Erlang VM)”的 erlang-questions帖子中写道:

在 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 FAQ 说 Mnesia 受 4 GB Dets 大小限制,但这个答案是在 dets 到 disk_log 更改之前写的
  • erlang.org 域上唯一的其他文档是 Håkan Mattsson 的文档,可以追溯到 dets 到 disk_log 更改之前

LYSE 似乎是第一个提到disc_copies表不受 Dets 表大小限制的“权威”来源。

于 2018-03-11T21:09:07.833 回答
6

根据文档,这是 4GB。第 11.5 节

http://erlang.org/faq/mnesia.html

于 2009-01-07T18:50:48.613 回答