3

ルックアップ テーブルを作成する必要があります。私は Dictionary を使用します。それには 45M long と 45M int が含まれています。key として long 、 value として int 。コレクションのサイズは (45M*12) で、long は 8 バイト、int は 4 バイトです。サイズは約 515 Mbyte です。しかし、実際にはプロセスのサイズは 1.3 Gbyte です。プロセスには、このルックアップ テーブルのみが含まれます。マットビー、辞書に代わるものはありますか??

どうも

4

5 に答える 5

3

どのくらいの努力を費やしても構わないと思いますか?
あなたは使用することができます

KeyValuePair<long,int>[] table = new KeyValuePair<long,int> [45 M];

次に、これを最初の列(long Key)で並べ替え、バイナリ検索を使用して値を見つけます。

于 2012-05-24T17:36:31.033 に答える
1

辞書にはデータを保持する基になる配列がありますが、配列のサイズはアイテムの数よりも大きくなければなりません。これが辞書の検索速度の源です。実際、基になる配列のサイズは、アイテムの数(25 +%)よりもかなり大きくする必要があります。これを、アイテムを追加するときに、この基になる配列の割り当てが解除されて再作成される(大きくするため)という事実と組み合わせると、ガベージコレクションの準備ができているかなりの量のメモリがあります(つまり、実際にさらに多くのメモリが必要な場合は、 GCはそれを再利用しますが、現在十分にあるので、気にする必要はありません)。

この辞書は、許容できるよりも多くのメモリを消費していますか、それとも、思ったよりも多い理由に興味がありますか?使用できるメモリは他にもありますが(他の回答やコメントにいくつか記載されています)、メモリの使用量は少なくなりますが、速度は遅くなります。メモリ不足の問題が発生していますか?

于 2012-05-24T17:39:21.707 に答える
1

範囲が 10^12 の最大 long 値に制限されている場合、スペースに関する問題は、int が保持できるよりも数ビットだけ必要なため、long を使用する必要があることです。その場合は、次のようなことができます: 512 Dictionary の配列にデータを格納します。

 var myData = new Dictionary<int,int>[512];

long 値 (この例では「キー」と呼びます) に関連付けられた int を参照するには、次のようにします。

myData[key & 511].Add((int) (key >> 9), intValue);
int result = myData[(int) (key & 511)][(int) (key >> 9)];

作成する辞書の数とビット操作で使用されるビット数は、データの実際の制約に適合するように調整する必要がある場合があります。このアプローチを使用すると、メモリ使用量が約 3 分の 1 に削減されます

于 2012-05-24T18:26:32.883 に答える
1

Dictionary の代わりに SortedList を使用すると、メモリ効率が向上しますが、CPU 効率がわずかに低下する可能性があります。メモリの測定に関する問題と、最初に大量のデータを一度にロードする必要がある理由を無視します:)

于 2012-05-24T17:35:40.453 に答える
0

データが静的であると仮定した場合の別のアプローチ:2つのソートされた配列(1つはlong、もう1つはint)を使用します。一方のインデックスNのアイテムが、もう一方のインデックスNのキーの値であることを確認してください。Array.BinarySearchを使用して、探しているキー値を見つけます。

于 2012-05-24T17:38:57.700 に答える