2

私はこれらの C++ ライブラリの多くに慣れていないので、私の質問が素朴であると感じた場合はご容赦ください。

それぞれ約 160 MB (それぞれ約 700000 行) の 2 つの大きなテキスト ファイルがあります。file1 に表示されるすべての重複行を file2 から削除する必要があります。これを実現するために、32 文字の文字列をキーとして unordered_map を使用することにしました。32 文字の文字列は、各行の最初の 32 文字です (これは行を一意に識別するのに十分です)。

とにかく、基本的には最初のファイルを調べて、各行の 32 文字の部分文字列を unordered_map にプッシュするだけです。次に、2 番目のファイルを調べて、file2 の行が unordered_map に存在するかどうかを確認します。存在しない場合は、行全体を新しいテキスト ファイルに書き込みます。

これは、小さなファイル (それぞれ 40 MB) では問題なく機能しますが、この 160 MB のファイルでは、ハッシュテーブルに挿入するのに非常に時間がかかります (file2 を見始める前に)。約 260,000 回の挿入で..停止したか、非常に遅くなったようです。メモリの限界に達した可能性はありますか? もしそうなら、誰かがこれを計算する方法を説明できますか? そうでない場合、それを高速化するために他にできることはありますか? カスタムハッシュ関数を選択したり、最適化に役立ついくつかのパラメータを指定したりしますか?

ハッシュ テーブルへのキー オブジェクト ペアは (string, int) で、文字列の長さは常に 32 文字で、int は重複を処理するために使用するカウントです。12 GB RAM を搭載した 64 ビット Windows 7 OS を実行しています。

どんな助けでも大歓迎です..みんなありがとう!!

4

2 に答える 2

3

関連データがないため、マップは必要ありません。順序付けられていないセットが機能します。また、Google のsparse_hash_setのようなメモリ効率の良いハッシュ セットの実装を使用します。メモリ効率が非常に高く、コンテンツをディスクに保存できます。

それとは別に、データの小さなチャンクで作業できます。たとえば、ファイルを 10 個のブロックに分割し、それぞれから重複を削除してから、重複のない 1 つのブロックになるまでそれらを結合します。あなたはアイデアを得る。

于 2011-06-13T18:04:04.503 に答える
0

これを行うためのC++プログラムは作成しませんが、既存のユーティリティをいくつか使用します。Linux、Unix、Cygwinでは、次の手順を実行します。

cat2つのファイルを1つの大きなファイルに:

# cat file1 file2 > file3

sort -u一意の線を抽出するために使用します。

# sort -u file3 > file4

独自のユーティリティを(再)作成するよりも、オペレーティングシステムユーティリティを使用することをお勧めします。

于 2011-06-13T18:45:06.620 に答える