25

byte長さが の の配列を作成しようとしていますUInt32.MaxValue。この配列は、本質的に小さな (っぽい) インメモリ データベースです。

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

ただし、私のマシンでは、実行時にSystem.OverflowException「算術演算でオーバーフローが発生しました」というメッセージが表示されます。

どうしたんだ?unsafeブロックとを使用する必要がありmallocますか? C#でそれを行うにはどうすればよいですか?

4

4 に答える 4

36

の現在の実装でSystem.ArrayInt32、すべての内部カウンターなどを使用しているため、理論上の要素の最大数は ですInt32.MaxValue

また、Microsoft CLR によって課されるオブジェクトあたりの最大サイズは 2 GB です。

ここで良い議論と回避策...

そして、いくつかの関連する、まったく重複していない質問と回答がここにあります...

于 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 に答える
0

私はまずこれをしません。このメモリ内データベースのために、なぜそのすべてのメモリを確保する必要があるのでしょうか? 進むにつれてサイズが増加するデータ構造が必要ではないでしょうか (例: List<int>)。または (必要に応じて) sqliteのようなメモリ内データベースを使用しますか?

于 2010-10-15T17:11:30.470 に答える