C#数组容量超过Int.MaxValue

14

我想知道在C#中是否有任何结构可以容纳超过Int.MaxValue(2,147,483,647)限制的极大信息集,以处理真正大规模的数据。这是否必须使用多级数组来完成?或者你能否创建一个具有Long.MaxValue最大长度的数组?如果可以,如何实现?


7
如果您计划创建这么大的数组,您应该重新考虑您的方法。 - Anthony -GISCOE-
1
想要建造下一个 Twitter 吗? - BoltClock
多级数组可能能解决问题,但存在内存不足的风险。你需要它来做什么? - devnull
我正在寻找一个将圣经数据存储在数组或列表中的解决方案,但看起来我将无法获得我想要的所有信息...因为我需要为每个希腊单词、每个希伯来单词、每个英语中的音译编号以及如果它被突出显示等都有一个元素。 - Richard J. Ross III
3
一个数据库解决方案更有可能是正确的选择。换句话说,将事物拆分到单词级别是不寻常的(除了一些研究希伯来语的 Qaballic 方法),因为你会失去不同经文之间的联系,因为翻译不是基于单个单词而是基于整个经文进行的。 - Jon Hanna
6个回答

10

这个已经完成了,一个BigArray<T>的示例实现在这里


太酷了!感谢你给我提供这个链接! - Richard J. Ross III

6

CLR目前对于任何单个对象都有2GB的限制 - 因此,即使对于byte类型的元素,您也必须将其构建为多个数组。虽然这应该是可行的。大多数正常的集合接口会失败,因为它们使用int作为索引、计数等。

我认为CLR本身并没有受到整体进程限制,这会阻止此操作 - 尽管您几乎肯定希望在64位CLR和操作系统上运行。


2
这有点奇怪,因为System.Array上有一个重载的GetValue方法,它需要一个长整型的索引,表明您可以拥有更大的数组 (http://msdn.microsoft.com/en-us/library/2zexc3z9.aspx)。 - Rune FS
1
@Rune:是的 - 我同意这很奇怪。可能有点过早设计。 - Jon Skeet
1
@LukeH - 是的,这就是奇怪的地方,当它们不添加任何内容时(除了误导不幸的人),为什么要添加它们呢?在实际支持它们的情况下添加它们不会造成破坏性变化。(当然,删除它们会) - Rune FS
1
@barnes:嗯,那是在尝试创建一个大小为8GB的数组...我相信现在有一个能够突破2GB限制的设置,但它是否允许创建一个8GB的数组,我不知道... - Jon Skeet
明白了,谢谢 :)。 - phougatv
显示剩余3条评论

4

您的要求是什么?很难相信,对于任何现实世界的问题,无论是否合法,一个比这更多元素的数组都将是正确的解决方案。您可能在考虑数据库,无论是持久化还是内存中都可以。这是组织非常大的数据集的标准方法。


3

如果索引器是long(int64),而不是int32,您只能使用基于索引的结构。

即使是List也无法使用,因为索引器是int32


没错,这正是我想的...嗯,看来我需要削减一些信息。 - Richard J. Ross III

1

很少的计算机有足够的内存来在内存中保存这样的结构。


@SLaks,那么也许我应该补充一下:很少的计算机可以处理这样的内存结构。 - Darin Dimitrov
private readonly int[] _arrInts = new int[IntMax]; 抛出了 System.OutOfMemoryException 异常。其中 private const int IntMax = int.MaxValue;。有任何想法是为什么? - phougatv

-2

ArrayList 可以包含超过 Int.MaxValue 的元素。


8
不行,因为构造函数只接受一个整数作为容量,因此不能超过Int32.MaxValue。 - Richard J. Ross III
4
@Richard:你的逻辑并不完全正确,因为容量会自动增加。你可以提供 int.MaxValue 然后再添加更多的项。我相当确定 ArrayList 仍然会失败,但这不仅仅是因为你不能将 最终 容量指定给构造函数作为 初始 容量。 Translated: @Richard: 你的逻辑并不完全正确,因为容量会自动增加。你可以提供 int.MaxValue,然后再添加更多的项。我很确定 ArrayList 仍然会失败,但问题不仅在于你不能将 最终 容量指定为构造函数的 初始 容量。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接