長さがUInt32.MaxValue
であるbyte
sの配列を作成しようとしています。この配列は、基本的にはメモリ内の小さなデータベースです。
byte[] countryCodes = new byte[UInt32.MaxValue];
ただし、私のマシンでは、実行時に「算術演算でオーバーフローが発生しました」というSystem.OverflowException
が表示されます。
どうしたんだ? unsafe
ブロックとmalloc
を使用する必要がありますか? C#ではどうすればよいですか?
System.Array
の現在の実装では、すべての内部カウンターなどにInt32
を使用しているため、要素の理論上の最大数はInt32.MaxValue
です。
また、Microsoft CLRによって課されるオブジェクトごとの最大サイズ2GBの制限もあります。
ここで良い議論と回避策...
そして、いくつかの関連する、かなり重複していない質問と回答をここに...
.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)
{}
}
バイト配列の最大長は2130702268です。次に例を示します。
var countryCodes = new byte[2130702268];
そもそもこれはしません。なぜこのインメモリデータベース用にすべてのメモリを確保したいのですか?進むにつれてサイズが増加するデータ構造が必要ではありませんか(例:List<int>
)?または(必要に応じて) sqlite ?のようなインメモリデータベースを使用しますか?