c# - 为什么 int 数组的最大大小小于 Int32.MaxValue?

标签 c# arrays .net random math.net

<分区>

尽管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# 似乎不再支持它。我找到了它的一个实现,但它在索引 524287 处抛出了 IndexOutOfRangeException,即使我将数组大小设置为 300 万。

最佳答案

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

关于c# - 为什么 int 数组的最大大小小于 Int32.MaxValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67202298/

相关文章:

c - 如何在C程序中将矩阵的第一列元素复制到第二列

arrays - 由于n-1维数组且没有循环,如何从n维数组中提取n-1维数组?

c# - Azure Functions 无法解释的冷启动

支持多线程的.NET ORM更好?

c# - mysql 加载数据本地显示来自 C# 的警告

c# - 使用 SQLDataReader 的可空 DateTime

python - 使用随机放置的 NaN 创建示例 numpy 数组

c# - 如何在 DataGridView 中仅调整特定列的大小?

c# - 如何在 JavaScript 方法中获取 ASP.NET DataGrid 控件的选定行索引?

c# - 如何在标签中加载数组?