各要素を同じサイズの整数にすることができるサイズ 10^9 要素の配列を作成したいと考えています。私は常にOutOfMemoryException
初期化行で取得します。どうすればこれを達成できますか?
これが不可能な場合は、代替戦略を提案してください。
各要素を同じサイズの整数にすることができるサイズ 10^9 要素の配列を作成したいと考えています。私は常にOutOfMemoryException
初期化行で取得します。どうすればこれを達成できますか?
これが不可能な場合は、代替戦略を提案してください。
アレイは、64 ビット プロセスであっても、.net 4.0 以前では 2GB に制限されています。したがって、10 億の要素では、サポートされる要素の最大サイズは 2 バイトですが、int
は 4 バイトです。したがって、これは機能しません。
より大きなコレクションが必要な場合は、複数の配列に支えられて自分で作成する必要があります。
.net 4.5 では、この制限を回避することができます。詳細については、Jon Skeet の回答を参照してください。
int
要素タイプとして意味すると仮定すると、64 ビット CLR を使用している場合は、.NET 4.5 を使用してこれを行うことができます。
<gcAllowVeryLargeObjects>
構成設定を使用する必要があります。これはデフォルトではオンになっていません。
古い CLR を使用している場合、または 32 ビット マシンを使用している場合は、うまくいきません。もちろん、64 ビット マシンを使用しているが古いバージョンの CLR のみを使用している場合は、「1 つの大きな配列」を小さな配列のリストを持つ別のオブジェクトにカプセル化できます。それを実装することもできますIList<int>
。これにより、実際には 1 つの配列を使用していないことをほとんどのコードで知る必要がなくなります。
(コメントで述べたように、2 31要素の配列しか作成できませんが、10 9という要件はこの範囲内です。)
このすべてのデータをメモリにロードしてファイルのどこかに保存し、配列として機能するが実際にはファイルとの間でデータを読み書きするクラスを作成するべきではないと思います
これは一般的な考え方です(もちろん、これはそのままでは機能しません。さらに、int値を書き込む前にバイト[]配列に変換する必要があります)
public class FileArray
{
Stream s;
public this[int index]
{
get { s.Position = index * 4; return s.Read(); }
set { s.Position = index * 4; s.Write(value); }
}
}
そうすれば、配列のように機能するものを手に入れることができますが、データはハードドライブに保存されます