約 220,000,000 (約 2 億 2000 万) の単語 / 文字列を含むファイル (サイズ = 約 1.9 GB) があります。重複があり、ほぼ 100 単語ごとに 1 つの重複単語があります。
2 番目のプログラムでは、ファイルを読み取ります。BufferedReader を使用して、行ごとにファイルを読み取ることに成功しました。
重複を削除するには、Set (およびその実装) を使用できますが、Set には、次の 3 つの異なるシナリオで説明する問題があります。
- デフォルトの JVM サイズでは、Set には最大 70 万〜80 万語が含まれ、それを超えると OutOfMemoryError が発生します。
- 512M の JVM サイズでは、Set には最大 500 万~600 万語が含まれ、それを超えると OOM エラーが発生します。
- 1024M の JVM サイズでは、Set には最大 1200 万~1300 万語を格納できますが、OOM エラーが発生します。ここで、1000 万レコードを Set に追加すると、操作が非常に遅くなります。たとえば、次の約 4000 レコードの追加には 60 秒かかりました。
JVM のサイズをこれ以上増やせないという制限があり、ファイルから重複する単語を削除したいと考えています。
このような巨大なファイルから Java を使用して重複した単語を削除する他の方法やアプローチについて何かアイデアがありましたら、お知らせください。よろしくお願いします :)
質問への情報の追加: 私の単語は基本的に英数字で、システム内で一意の ID です。したがって、単純な英語の単語ではありません。
ベストアンサー1
使用マージソート2 回目のパスで重複を削除します。マージ中に重複を削除することもできます (出力に追加された最新の単語を RAM に保持し、候補もそれと比較します)。