2012-01-17 11 views
1

.netのトライ実装を探しています。.netの効率的なトライ実装

私はインメモリオブジェクトプールのインデックス構造として使用する予定です。スレッドセーフである必要はなく(スレッドを1つしか更新しないので)、少なくとも2千万のアイテムを優雅にかつ一定のパフォーマンスで対処できるはずです。

ネット上で見つかったものは、サンプルコードまたはおもちゃプロジェクトのようです。だから、私は本当に生産品質の実装を探しています。利用可能であれば、商用ライブラリもOKです。

PS:あまりにも多くのメモリを使用していて、配列に基づいてメモリの断片化を引き起こす傾向があると思われるハッシュテーブルの実装のように試行を選択しました。 O(1)ルックアップ特性および多数の項目に対する良性のメモリ使用特性を有するそのようなコンテナもOKであり得る。

は、.NET独自のメモリ管理は、私がお勧めしたい方法ではありません第二推測しようとする私の個人的意見では、

+0

2000万項目を?この場合のトライのメモリ使用量は、辞書/ハッシュテーブルよりも大きいことがほぼ保証されています - おそらく数桁の大きさで...実際にはオブジェクトのメモリプールが必要ですか? .Net独自のメモリ管理は非常に堅実です。 –

+0

あなたが試した標準的なデータ構造はどれですか? (理由を説明してください) – Peter

答えて

0

、ありがとうございました。ネイティブのシナリオで可能なメモリ割り当てのレベルを制御することはできませんが、同じようにする必要はありません。私は最初にC++(私は自分のヒープで定期的に作業し、メモリローカリゼーションルーチンなどを書く)から移動したときにこれを行うという欲求に執着していましたが、すぐには必要なかったことが素早く明らかになりました。また I.

たとえば、トライの下部に配列MyPooledObjectを配置することもできますが、リファレンスタイプの場合は参照の配列が得られます。それぞれはどこか他の場所にあります - あなたは自分自身を制御することはできません。

代わりに値型を使用していますが、これらはプールされたシナリオでの使用には適していません。カスタム値の型は不変である必要があります(私はそれを正当化せずに安全に言うことができます - 構造体をターゲットとするサイト:stackoverflow.comより多くを参照してください)、したがって再利用可能なオブジェクトとして扱うことはできません。

各オブジェクトがハッシュ対応キーで認識できるインデックス付きオブジェクトのコレクションが必要な場合は、辞書を使用します。あなたは、メモリに収まるようにあまりにも多くのオブジェクトがある場合は

次のいずれか

1)より多くのメモリ

2ゲット)それ

または両方のデータベースとキャッシュローカルセグメントを使用する:あなたは可能性がありAppFabric and its cache featuresを見ると、何百万ものオブジェクトのメモリ内キャッシュを実行する専用のマシンファームを構築できます。ハードウェアのコストは、おそらく.NET用独自のメモリ管理ソリューションを開発するコストよりも少なくなります:)

+0

私は実際に.netフレームワークとC5ライブラリですべてのハッシュテーブルの実装を試みました。ハッシュテーブルの問題は、配列に基づいていることです。配列バッファがいっぱいになると、構造体全体を二重の容量で再割り当てしようとします。したがって、システム上で多くの追加が行われると、連続したメモリの場所が急速に使い果たされるため、メモリの断片化やメモリ不足のエラーが発生します。そのように動作しないハッシュテーブルの実装は非常に便利ですが、それも見つけられませんでした。 –

+0

参照配列は、ポインタ配列のサイズとほぼ同じ大きさです。あなたのケースでは、20ミル= 64ビットの土地で約80Mbまたは160Mbです。大容量のハッシュテーブルや辞書を作成するだけではいかがですか? –

+0

ゾルタンさん、ありがとうございました。私はあなたの提案に答えなかったことを忘れてしまったに違いない。実際に最終的なサイズに近い大きなチャンクをあらかじめ割り当てておき、それを標準の辞書を使って再生させる方法です。私はまた、辞書のキーをより小さな部分にカットし、辞書の階層を保って演奏しました。それも機能しますがサブサブ辞書を追跡することは複雑で、最大サイズの球場図が分かっていれば大きな利点はありません。だから、私は最後に単純なアプローチをしました。 –

-1

は、このライブラリを見てみましょう:TrieNet

using Gma.DataStructures.StringSearch; 

... 

var trie = new SuffixTrie<int>(3); 

trie.Add("hello", 1); 
trie.Add("world", 2); 
trie.Add("hell", 3); 

var result = trie.Retrieve("hel"); 
+0

答えとしてツールやライブラリを投稿しないでください。少なくとも、その問題を解決する方法(http://meta.stackoverflow.com/a/251605)を解答そのものに示してください。 – paper1111

+0

1.これはまさにこの質問に対する予想される答えです。それではなぜですか? 2.私はこの広く使われているライブラリの著者であり、十分な例とドキュメントがリポジトリにあります。 –

+1

https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers/8259#8259を参照してください。回答には例を含める必要があります。 – paper1111

関連する問題