2011-04-01 5 views
6

C#アプリケーションでルックアップマップや辞書を使用したいが、1〜2GBのデータを保存することが予想されます。C#で非常に大きな辞書を使用するにはどうすればよいですか?

誰かがまだ辞書クラスを使用できるかどうか、または他のクラスを使用する必要がある場合は教えてください。

EDIT:oracleデータベースを使用してオブジェクトの詳細を照会または検索する既存のアプリケーションがあります。ただし、同じオブジェクトが繰り返し照会されるため、遅すぎます。応答時間を改善するために、このシナリオでルックアップマップを使用するのが理想的かもしれないと感じました。しかし、私はサイズがはい、あなたがしなければならない、それ問題

+0

これほど多くのメモリを使用する辞書のインスタンスをスピンアップしようとしましたか?また、このアプリケーションは32または64ビットシステムに導入されますか? – RQDQ

+1

なぜ辞書またはメモリ内のデータ構造ですか?なぜデータベースではないのですか? –

+2

SqlLiteはあなたの状況に興味深い、クールなインメモリDBを持っています。 – gt124

答えて

7

短い答え

はい。マシンに十分な構造体メモリ(およびオペレーティングシステムを含むプログラムとシステムの残りのオーバーヘッド)がある場合。

ロング回答

は、あなたがしてもよろしいですか?アプリケーションについてもっと知らなくても、何を示唆するのかを知ることは難しいです。

  • ここからのデータはどこですか?ファイル?ファイル?データベース?サービス?
  • キャッシュメカニズムですか?その場合、しばらくアクセスされていないアイテムをキャッシュから期限切れにできますか?この方法では、すべてのことを常にメモリに保持する必要はありません。
  • 多くのデータを格納しようとしているだけであれば、データベースを使用できますか?そうすれば、一度にすべての情報をメモリに保存する必要はありません。索引付けにより、ほとんどのデータベースは高速検索を実行するのに優れています。このアプローチをキャッシュと組み合わせることができます。
  • メモリに読み込まれるデータは読み取り専用か、何か変更されたときに一部の記憶域に保持される必要がありますか?
  • スケーラビリティ - この辞書に格納されるデータの量は、時間の経過とともに増加すると思われますか?そうであれば、この量のデータを処理できるマシンを購入するのは非常に高額になります。このような場合(AppFrabricが思い浮かぶ)、分散キャッシングシステムを見て、縦方向ではなく横方向(より多くのマシン)にスケールアウトすることができます。ポスターの編集の光で

UPDATE

キャッシングはここに長い道のりを行くだろうと同じように、それが聞こえます。これを行うには多くの方法があります:

  • 単純な辞書キャッシング - 要求されたものをキャッシュします。
  • Memcache
  • Caching Application Block私はこの実装の巨大なファンではありませんが、他は成功しています。
0

あなたがたが、大きなとして辞書についてあなたは限り、あなたは64ギガバイトのマシンにしているとしてデータベース

1

を使用してオフに優れていることができるようになります場合は心配していますその大規模な辞書を使用することができます。しかし、多くのデータがある場合は、データベースが適切かもしれません(cassandraは実際には巨大な辞書ですが、常にMySQLがあります)。

+1

ちょっとしたことに注意してください...アプリケーションは、2GB以上のメモリを占有するプロセスのために、64ビット(または64ビットマシン上の任意のCPU)にコンパイルする必要があります(とにかく2GBだと思います)。 –

1

1〜2GBのデータを言うときは、項目が累積的に1〜2GBの複雑なオブジェクトであると仮定します。

構造体でない限り(そしてそうでなければならない)、辞書はアイテムの大きさに気を付けません。
あなたが約2未満のものを持っている限り、私は帽子からその数を引っ張ったものの、メモリに収まる程度に記憶することができます。

しかし、誰もが示唆しているように、おそらくデータベースを代わりに使用するべきです。
SQL CEなどのメモリ内データベースを使用できます。

0

データベースを使用します。 DBモデルが適切かどうかを確認し、正しいインデックスを入れてください。

-2

subdictionariesを使用できます。 KeyAKeyBのいくつかの共通部分である

Dictionary<KeyA, Dictionary<KeyB .... 

たとえば、Stringの辞書がある場合は、最初の文字をKeyAとして使用できます。

+0

これはどのように問題に対処していますか?これはあいまいなキャッシュ分割スキームのように見え、ユーザーがデータベースから結果をキャッシュする必要があるかどうかを答えることとは関係ありません。 – RQDQ

+0

それは問題を解決します。はい、それはパーティションスキームです(辞書の問題 - メモリ割り当て、メモリが2倍のメモリを割り当て終わるとパーティションスキームを使用するとプロセスが苦しくならない)。あなたが多くのRAMを持っている場合は、RAMに(データベースではなく)本当に大きな辞書を持っていたい、またはあなたはメモリから出るでしょう。また、64ビットにアプリケーションを切り替えることができます - 多分それはあなたがしようとする必要があります最初にする必要があります... –

関連する問題