【问题标题】:Why is Max size of int array lower than Int32.MaxValue? [duplicate]为什么 int 数组的 Max size 小于 Int32.MaxValue? [复制]
【发布时间】:2021-07-16 00:42:08
【问题描述】:

即使this post says it should work,如果您创建一个大小为 Int32.MaxValue 的 int 数组,它也会抛出一个 OutOfMemoryException: Array dimensions exceeded supported range.

根据我的测试,数组可以初始化的最大大小似乎是Int32.MaxValue - 1048576 (2,146,435,071)。 1048576 是 2^20。所以只有这个有效:

var maxSizeOfIntArray = Int32.MaxValue - 1048576;
var array = new int[maxSizeOfIntArray];

有人知道为什么吗?有没有办法创建一个更大的整数数组?

PS:我需要使用数组而不是列表,因为 Math.Net 库只返回随机数集的数组,这些随机数集是加密安全的伪随机数生成器

是的,我查看了其他链接的问题,但它们不正确,因为这些问题说最大尺寸是 Int32.MaxValue,这与我的计算机允许我做的不同

是的,我知道数组的大小是 8GB,我需要生成一个包含数十亿行的数据集,以便使用更难的测试套件来测试随机性

我还尝试了创建BigArray<T> 的选项,但C# 似乎不再支持该选项。我找到了它的一个实现,但是即使我将数组大小设置为 300 万,它也会在索引 524287 处引发 IndexOutOfRangeException。

【问题讨论】:

  • 每个 int 4 个字节是相当大的内存块。你真的确定你需要那么多吗?
  • 一个只返回数组的库那为什么需要创建数组呢?
  • 正如@BrianWilson 在他的回答中解释的那样,该数组将消耗 8GB 内存。好多啊。对于如此庞大的维度的数组,您的用例是什么。 sparse array 实现可能会更好(其中最简单的实现是在Dictionary<int, T> 之上实现T 类型的稀疏数组)。我怀疑你不能在一次分配中分配超过 GC 的 临时段大小docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…
  • @HansKesting 我需要它来创建一个超过 100 亿个数字的超级大文件,以便使用 dieharder 测试随机数生成器中的偏差

标签: c# arrays .net random math.net


【解决方案1】:

Int32 是 32 位或 4 个字节。 Int32 的最大值为 2,147,483,647。因此,如果您可以创建一个包含 2,147,483,647 个元素的数组,其中每个元素为 4 个字节,那么您将需要一块大小为 8GB 的​​连续内存。这是非常大的,即使您的机器有 128GB 的​​ RAM(并且您在 64 位进程中运行),这也超出了现实的比例。如果你真的需要使用这么多内存(并且你的系统有),我建议你使用本机代码(即 C++)。

【讨论】:

  • 如何使用“本机”代码来帮助内存消耗以存储整数?
  • 这如何回答 OP 的问题?以及使用本机代码将如何改变任何事情?
  • Mark Benningfield,对不起,如果您想了解本机代码如何/为什么在内存使用和处理方面为您提供更多功能和灵活性的解释,请提出问题。不过,我会这么说---.NET(和 .NET 核心)是用本机代码编写的虚拟机。您可以使用本机代码执行任何 .NET 可以执行的操作,等等。你离硬件更近了。
  • Johan Donne:同样的事情:我不会使用 StackOverflow 注释来解释本机代码的工作原理。随时提出问题。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2014-11-01
相关资源
最近更新 更多