~220,000,000 (~220 ミリオン) の単語/文字列を含むファイル (サイズ = ~1.9 GB) があります。それらには重複があり、100単語ごとにほぼ1つの重複単語があります。
2 番目のプログラムでは、ファイルを読み取りたいと考えています。BufferedReader を使用して、ファイルを行単位で読み取ることに成功しました。
重複を削除するには、Set (およびその実装) を使用できますが、次の 3 つの異なるシナリオで説明するように、Set には問題があります。
- デフォルトの JVM サイズでは、Set には最大 70 万から 80 万の単語を含めることができ、次に OutOfMemoryError を含めることができます。
- 5 億 1200 万の JVM サイズでは、Set には最大 500 万から 600 万の単語が含まれ、その後 OOM エラーが発生する可能性があります。
- JVM サイズが 1024M の場合、Set には最大 1200 万から 1300 万の単語が含まれ、その後 OOM エラーが発生する可能性があります。ここで Set に 1000 万件のレコードが追加されると、操作が非常に遅くなります。たとえば、次の ~4000 レコードの追加には 60 秒かかりました。
JVM サイズをこれ以上増やすことができないという制限があり、ファイルから重複した単語を削除したいと考えています。
このような巨大なファイルから Java を使用して重複する単語を削除する他の方法やアプローチについて何か考えがあれば教えてください。どうもありがとう :)
質問への情報の追加: 私の言葉は基本的に英数字であり、システム内で一意の ID です。したがって、それらは平易な英単語ではありません。