30GB以上のファイルがあります。そして、このファイルの各行はレコードと呼ばれ、2つの列で構成されています。これは次のようになります。
id1 id2
この2つのIDはすべて整数(32ビット)です。私の仕事は、すべての重複レコードを削除し、レコードを一意にし、最後に一意のid2をファイルに出力するプログラムを作成することです。
いくつかの制約があり、最大で30Gのメモリが許可され、非マルチスレッド/プロセスプログラムによって効率的にジョブを実行する方が適切です。
最初に私はアイデアを思いつきました。メモリの制約のため、ファイルをn回読み取ることにしました。それぞれ、。を含むレコードのみをメモリに保持しid1 % n = i (i = 0,1,2,..,n-1)
ます。私が使用するデータ構造はでstd::map<int, std::set<int> >
、id1をキーとして受け取り、id2をid1に配置しますstd::set
。
このように、メモリの制約に違反することはありませんが、非常に低速です。std::map
とstd::set
が大きくなると挿入速度が遅くなるからだと思います。さらに、ファイルをn回読み取る必要があります。各ラウンドが完了するとstd::map
、次のラウンドのクリアも必要になりますが、これにも時間がかかります。
ハッシュも試してみましたが、 300Wのバケットでも衝突が多すぎるのではないかと思いました。
だから、私はここに私の問題を投稿します、あなたたちが私にもっと良いデータ構造やアルゴリズムを提供できるのを手伝ってください。
どうもありがとう。
PS
スクリプト(シェル、Python)が効率的に実行できる場合は、それが望まれます。