web-dev-qa-db-ja.com

バイトの最大長[]?

長さがUInt32.MaxValueであるbytesの配列を作成しようとしています。この配列は、基本的にはメモリ内の小さなデータベースです。

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

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

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

20
GoHeavyOrGoHome

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

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

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

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

28
LukeH

.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)
    {}
}
8
Nick

バイト配列の最大長は2130702268です。次に例を示します。

var countryCodes = new byte[2130702268];
2
Milad Hatami

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

1
steinar