単語数が2億を超える場合にJavaを使用して重複した単語を削除するにはどうすればよいでしょうか? 質問する

単語数が2億を超える場合にJavaを使用して重複した単語を削除するにはどうすればよいでしょうか? 質問する

約 220,000,000 (約 2 億 2000 万) の単語 / 文字列を含むファイル (サイズ = 約 1.9 GB) があります。重複があり、ほぼ 100 単語ごとに 1 つの重複単語があります。

2 番目のプログラムでは、ファイルを読み取ります。BufferedReader を使用して、行ごとにファイルを読み取ることに成功しました。

重複を削除するには、Set (およびその実装) を使用できますが、Set には、次の 3 つの異なるシナリオで説明する問題があります。

  1. デフォルトの JVM サイズでは、Set には最大 70 万〜80 万語が含まれ、それを超えると OutOfMemoryError が発生します。
  2. 512M の JVM サイズでは、Set には最大 500 万~600 万語が含まれ、それを超えると OOM エラーが発生します。
  3. 1024M の JVM サイズでは、Set には最大 1200 万~1300 万語を格納できますが、OOM エラーが発生します。ここで、1000 万レコードを Set に追加すると、操作が非常に遅くなります。たとえば、次の約 4000 レコードの追加には 60 秒かかりました。

JVM のサイズをこれ以上増やせないという制限があり、ファイルから重複する単語を削除したいと考えています。

このような巨大なファイルから Java を使用して重複した単語を削除する他の方法やアプローチについて何かアイデアがありましたら、お知らせください。よろしくお願いします :)

質問への情報の追加: 私の単語は基本的に英数字で、システム内で一意の ID です。したがって、単純な英語の単語ではありません。

ベストアンサー1

使用マージソート2 回目のパスで重複を削除します。マージ中に重複を削除することもできます (出力に追加された最新の単語を RAM に保持し、候補もそれと比較します)。

おすすめ記事