何百万ものレコードを含むファイルがあります。ファイル内のすべての行 (レコード) には、1 つのユーザー ID と対応する URL (文字列) があります。ファイルで最も訪問された 1000 の URL (文字列) を見つける必要があります。
Javaアプリケーションを使用してこれを行う必要があります。可能な限り最善のアプローチは何ですか?
何百万ものレコードを含むファイルがあります。ファイル内のすべての行 (レコード) には、1 つのユーザー ID と対応する URL (文字列) があります。ファイルで最も訪問された 1000 の URL (文字列) を見つける必要があります。
Javaアプリケーションを使用してこれを行う必要があります。可能な限り最善のアプローチは何ですか?
Javaではありませんが、記録のために:
$ cat records.txt
user1 http://example.com/
user2 http://example.com/
user2 http://example.com/some/path
user1 http://example.com/yet/another path
$ cut -d" " -f2 < records.txt | sort | uniq -c | sort -n -r | head -1000
URL をキーとし、カウントを値とする Map は、確かに最も単純なアプローチです (例: HashMap<String, Integer>
)。行を読み取るたびにカウントを増やします。
トップ 1000 を取得するには、すべてのエントリを、エントリの値でソートTreeSet
するカスタムを使用して に投入します。Comparator
次に、セット内の最初の 1000 項目をダンプします。
これは、「数百万」のレコードで機能するはずです。ただし、すべてがメモリ内で行われるため、数十億、または数億のレコードがある場合、問題が発生する可能性があります。
それをデータベースに挿入し、「select count(*), url from Visited group by url order by count(*)」のような SQL クエリでデータを取得します。