【发布时间】: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