当前位置:  开发笔记 > 编程语言 > 正文

Mnesia数据库的存储容量是多少?

如何解决《Mnesia数据库的存储容量是多少?》经验,为你挑选了3个好方法。

有些地方国家2GB期间.有些地方表示它取决于节点数量.



1> archaelus..:

如果您的问题是"由大量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)中.在这种情况下,表的容量受后端存储的限制.


据我所知,dets只能处理2GB文件而不能处理4GB,这将是disc_copies的限制.有一个实验性的64位dets可以处理更大的文件,但还没有人在生产中使用它.

2> legoscia..:

当涉及到类型表时,这个答案与现有的两个答案相矛盾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在2001年从dets移动到disk_log

通常认为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.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月开始(参见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表大小限制的表的"权威"来源.



3> Ray Booysen..:

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

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有