100GBの辞書を照会するためのc++プログラムを作成しました。辞書を同じサイズのn個のファイルに分割しました。すべての分割ファイルは同じディレクトリに配置されます。辞書は完全に索引付けされています。つまり、クエリが来ると、どのspit-fileを開き、どこを探すかがわかります。私の質問は、パフォーマンスを向上させることです。(a)大きなファイルの数が少ないのか、(b)小さなファイルの数が多いのか。また、理想的な分割は何でしょうか?
2 に答える
辞書は静的ですか、それとも実行時に変更できますか?
静的な場合は、すべてに1つのファイルを使用します。
動的で、インデックスが「ベクトル」である場合(最善のアイデアではありません)、データ用のファイルとインデックスごとに1つのファイルを使用します。
動的で、インデックスが「ツリー」である場合(100%連続していないADTのような両端キューやその他のベクトルを含む)、速度の点で意味がない限り、単一のファイルを再度使用して、インデックスを別々のボリュームに格納できます。
最初にファイルを開く必要があり、ファイルの開閉ペナルティが発生しないようにする必要があります。
アプリケーションが64ビットの場合は、ファイル全体をメモリにマップし、残りはOSに任せてください。
アプリケーションが32ビットの場合でも、メモリマッピングを使用してファイルにアクセスします。実行する必要のある同時アクセスごとに、メモリマップド「ウィンドウ」を作成する必要があります(静的データの場合、データのスレッドごとに1つ、各インデックスのスレッドごとに1つまたは2つ)。
その質問に対する直接の答えはないと思います。実験するだけでわかります。読み取り用にファイルを開くコストは、サイズに関係なく一定である必要があります。その場合、ファイルの内容の読み取りは、もちろんファイルサイズに依存します。
他にもヒントがありますが、クエリを取得したら、ファイルを開いて完全に解析/読み取り、または単語が見つかるまでファイルを閉じて結果を返すと仮定します。この場合、実行する多くの拡張機能があります。多分あなたはそれらを持っているかもしれません、多分持っていないかもしれませんが、ここに行きます
- 大量のクエリを取得する場合、ファイルを開くのにコストがかかる可能性があります。この場合、パフォーマンスを向上させるためにファイルまたは検索クエリをキャッシュする必要があります。
- ファイルを開いて読み取るときは、順番に実行します。これは、多かれ少なかれファイルがメモリにロードされていることを意味します。必要なものだけをロードできるjava用のsaxxmlパーサーに一度遭遇しました。非常に巨大なxmlファイルを処理するためのxmlのチャンクをメモリに入れます。おそらく、c++にも似たようなものがあります。SAXプロジェクト
ファイルがメモリにロードされるタイミングを確認してください
まったく異なるアプローチは、インデックス付きのデータベースを使用することです。この問題は、ファイルを開く問題に対処する必要はありません