1

一意の文字列を保持するために、C++ マップに多くの文字列を格納する必要があり、文字列の重複が発生した場合は、カウンター (pair.second) をインクリメントするだけです。私は c++ マップを使用しましたが、この状況によく合います。処理が30ギガまでなくなったので、これをメモリではなくファイルに保持しようとしています。

この場合、 map よりも高速な tri にも遭遇しました。ファイルに裏打ちされたトライの実装を知っている人はいますか? 私が探しているものに似たTrie実装に出くわしましたが、バグがないようには見えません..

4

2 に答える 2

2

一度に 30GB をメモリにロードするにはどうすればよいでしょうか? そして、それはあなたが望む辞書ベースの動作であるため、挿入またはインクリメントするたびに、ルックアップのためにファイル全体を(たとえ少しずつでも)ロードする必要があると思います。

データベースを使用することをお勧めします。それが彼らの目的です...

于 2009-11-07T21:15:40.927 に答える
1

文字列を含むファイルを並べ替えることができれば、並べ替えられたリストを読み取って重複を数えるのは簡単です。(元のファイルを保持して、ソートされた文字列の新しいファイルを作成できます。) 大きなファイルを効率的にソートすることは、古いテクノロジです。そのためのユーティリティを見つけることができるはずです。

を並べ替えることができない場合は、文字列を消化することを検討してください。MD5 は、あなたの目的にはやり過ぎかもしれません。あなたは何かを石畳にすることができます。数十億の文字列の場合、8 バイトのダイジェストを使用できます。ダイジェストのツリー (おそらく BST) を使用します。ダイジェストごとに、そのダイジェストを生成する一意の文字列のファイル オフセットを保存します。

文字列を読み取るときは、ダイジェストを計算して調べます。ダイジェストが見つからない場合は、文字列が一意であることがわかります。ツリーに格納します。ダイジェストが見つかった場合は、関連する各文字列をチェックして一致するかどうかを確認し、それに応じて処理します。

文字列を比較するには、ファイルに移動する必要があります。保存したのはファイル オフセットだけだからです。

2 つのダイジェストが異なる場合、それらを生成した文字列も異なる必要があることを覚えておくことが重要です。ダイジェストが同じ場合、文字列が同じではない可能性があるため、確認する必要があります。このアルゴリズムは、重複する文字列が少ないほど効率的になります。

于 2009-11-08T02:33:16.643 に答える