25

我正在尝试创建一个byte长度为 s 的数组UInt32.MaxValue。这个数组本质上是一个小的(ish)内存数据库:

byte[] countryCodes = new byte[UInt32.MaxValue];

然而,在我的机器上,在运行时,我得到一个System.OverflowException“算术运算导致溢出”。

这是怎么回事?我需要使用unsafe块和malloc吗?我将如何在 C# 中做到这一点?

4

4 回答 4

36

当前实现System.Array使用Int32所有内部计数器等,因此理论上的最大元素数为Int32.MaxValue.

Microsoft CLR 还规定了每个对象最大大小为 2GB 的限制。

一个很好的讨论和解决方法在这里......

还有一些相关的,不完全重复的问题和答案......

于 2010-10-15T16:48:30.807 回答
13

在 .NET 4.5 上,字节数组的最大可实例化长度为:2147483591,或比 int.MaxValue 小 56。通过以下方式找到:

for (int i = int.MaxValue; i > 0; i--)
{
    try
    {
        byte[] b = new byte[i];
        Console.Out.WriteLine("MaxValue: " + i);
        Environment.Exit(0);
    }
    catch (Exception ignored)
    {}
}
于 2013-08-21T00:31:30.603 回答
3

字节数组的最大长度为:2130702268。例如:

var countryCodes = new byte[2130702268];
于 2018-12-29T06:29:12.617 回答
0

一开始我不会这样做。为什么要为这个内存数据库留出所有内存?您不想要一个随着您的进行而增加大小的数据结构(例如List<int>)吗?或者(如果愿意)使用像sqlite这样的内存数据库?

于 2010-10-15T17:11:30.470 回答