1

私は、ファイルとそれらに現れる単語 (頻度) のインデックスを保持するために使用するテキスト ファイルを持っています。ファイルをメモリに読み込み、単語を保存して検索できるようにする必要があります。ファイルは次のようにフォーマットされます。

<files> 169
    0:file0.txt
    1:file1.txt
    2:file2.txt
    3:file3.txt
    ... etc ...
</files>
<list> word 2
    9: 10
    1: 2
</list>
<list> word2 4
    3: 19
    5: 12
    0: 2
    8: 2
</list>
... etc ...

問題は、このインデックス ファイルが非常に大きくなる可能性があり、すべてが一度にメモリに収まらないことです。私の解決策は、一度に HashTable にそれらのほんの一握りだけを格納し、別の単語のデータを取得する必要があるときに、古い単語を追い出し、ファイルから新しい単語のデータを解析することです。

Cでこれを効率的に達成するにはどうすればよいですか? 特定のポイントに到達したら、fseekと巻き戻しで何かをしなければならないと思っていました。

ありがとう、
マイク

4

3 に答える 3

1

Cの文字列サポートは不十分ですが、サンプルを見るとわかりますが、パターンが明確であるため、ディスクからこれを再解析するのが実用的です。

ただし、ファイルをデータベースに変換して、そこから作業することを検討します。そうしない理由がない限り、サードパーティのデータベースエンジンを利用してください。

テキストファイルの再解析に行くことにした場合、それはそれほど難しくは見えません。最初のパスでは、各リストの開始位置をペアで保存します。次に、特定の単語のデータを読み取るためにインデックスを探すだけです。

効率の問題が、コンピューターが解析を実行するのにかかる時間である場合は、それを忘れて、自分にとって最も簡単な方法を見つけてください。必要がわかるまで最適化しないでください。コンピューターは高速で安価ですが、プログラマーはそうではありません。

于 2011-05-05T03:13:06.380 に答える
1

mattnz が指摘したように、これは別のデータベース レイヤーを使用して実現するのが最適です。SQLite を試すことができます。セットアップはほとんどゼロで、非常に安定しています。それ以外の場合は、C でこれを行う場合は、ファイルの各セクションへのリンク/インデックスを含むヘッダーをファイルの先頭に配置できます。セクションは <files>..</files>、<list>..</list> です。これは私の頭の上にあります。データベースの実装に関する本を読めば、さらに多くのテクニックを見つけることができます。

于 2011-05-05T06:29:14.317 に答える
0

これを (私のニーズに合わせて) 行う最善の方法は、ファイル内の現在の場所へのポインターを保持しrewind( FILE *f );、最後に到達したときに使用することでした。

于 2011-05-13T16:28:53.090 に答える