2 人のユーザーが同じグループにいる回数をカウントするプログラムを作成する必要があります。ユーザーはユーザー名で、グループは ID で指定されます。たとえば、入力 (テキスト ファイルに保存) を使用すると、次のようになります。
john 32
john 21
jim 21
jim 32
bob 32
結果が欲しい:
john-jim 2
john-bob 1
jim-bob 1
これは些細なことに聞こえます。しかし問題は、180 万のグループと 300,000 のユーザーがいるということです。そして、多くのメンバーシップ (ユーザーあたり少なくとも平均 50、おそらくそれ以上になると予想しています)。これは、膨大な量のデータと処理を意味します。
私はこれを行う 5 つの異なるプログラムを作成しましたが、どれもデータ量を削減できませんでした: PostgreSQL クエリとしては遅すぎました。Java 作業メモリ内の Map で実行すると、メモリを消費しすぎます (最初のヒープ領域、最適化後、まれに「GC オーバーヘッド制限を超えました」)。Java からデータベースに継続的に書き込むには遅すぎます (バッチクエリを使用して最適化した場合でも)。ますます必死になって、すべてのペアを配列に書き込み、それらを並べ替え (O(n log (n)))、peu à peu をカウントするなど、よりエキゾチックなことを試しました。しかし、それでもメモリに保存するにはデータが多すぎました。
これを行うためのアルゴリズムに関するアイデアはありますか? それとも無理ですか?