背景:ファイルシステムの辞書から定義(科学)を検索するWindows Mobile用のC#アプリケーションを作成しています。ユーザーが単語を入力して、できるだけ速く意味を得ることができる必要がありファイル内のキーへの高速アクセス(ファイル全体をメモリにロードせずに)
Word1:Meanings(2)
-meaning 1 bla bla bla
-meading 2 bla bla bla
[...]
: ファイルは、この(ファイルが100K +のエントリを持っている)のように見えます。ユーザーは1語または2語のみを検索します。これを行うには、私はソートされたリストで実際の単語とバイトオフセットの辞書ファイルで2番目のファイルを作成しました。 例:
word1:12344
word2:32241
word3:298
私は(すべてのラインを介して単純なループと等しい場合の比較)私の「インデックス」に目を通した後、「ランダム・アクセス」のバイト・オフセットを使用して辞書ファイル。 問題は、これはまだ遅いです。 インデックスを配列/リスト/ハッシュテーブルにロードしようとしましたが、遅いioのために、これは時間がかかりすぎて(インデックスのロードに約20秒かかる)。これは、ユーザーが一般的に1語だけを検索するため、悪いことです。 したがって、(インデックス全体を走査することなく)ファイル上で直接動作できるいくつかのタイプのn-tree実装を探しています。 誰かがこれを行う方法をアドバイスしていますか? 新しいインデックスはこの形式になっています:
a:FileOffsetInDictionary:FileOffsetOf"ab" //the first 2 character starting with a
b:FileOffsetInDictionary:FileOffsetOf"ba"
c:FileOffsetInDictionary:0 //"0" means that their are no words starting with "c" (just for example)
[...]
ab:FileOffsetInDictionary:FileOffsetOf"aba"
ac:FileOffsetInDictionary:878878 //(just some random values for illustration)
[...]
ba:FileOffsetInDictionary:456
[...]
aba:FileOffsetInDictionary:2342
[...]
と検索このように行われる:
Users enter the word "Tree"
Look for "t" in index by looping through the index
if "t" found then goto FileOffsetOf2Digit
if "tr" found then goto FileOffsetOf3Digit
[...]
[actually recursively coded]
基本的にデータベースへのインデックス付きアクセスを再実装しています。 SQL Server CEなど、実際のデータベースをタスクに使用することを検討しましたか?これは、Windows Mobile上で正常に動作するファイルベースのデータベースシステムであり、アプリケーションに少数の(小さな)DLLを含める必要があります。 – Heinzi
@Heinziご回答ありがとうございます。それが本当のビジネスアプリケーションであれば、私はSQLデータベースを使用します。しかし、私はコンピュータサイエンスが大好きで、通常のSQLデータベースより速いものを書こうと思っていました:)現在の目標は、各キーストロークの後に結果を表示することです( "tre"は "tree"、 "trends"の結果を表示する必要があります) – justin
ファイルから読み取るコード?それは我々が助けることができるいくつかのパフォーマンス上の問題を有するかもしれない。 – user7116