当单词超过2亿时,如何使用Java删除重复单词?

2022-09-02 00:24:31

我有一个文件(大小= ~1.9 GB),其中包含约220,000,000(约2.2亿)个单词/字符串。他们有重复,几乎每100个单词就有1个重复的单词。

在我的第二个程序中,我想读取文件。我成功地使用BufferedReader按行读取文件。

现在要删除重复项,我们可以使用 Set(及其实现),但 Set 存在问题,如以下 3 种不同的方案所述:

  1. 使用默认的 JVM 大小,Set 最多可以包含 0.7-0.8 百万字,然后是 OutOfMemoryError。
  2. 对于512M JVM大小,Set最多可以包含5-600万字,然后是OOM错误。
  3. 使用1024M JVM大小,Set最多可以包含12-1300万字,然后是OOM错误。在这里,将1000万条记录添加到Set中后,操作变得非常缓慢。例如,添加下一个 ~4000 条记录,需要 60 秒。

我有限制,我不能进一步增加JVM大小,我想从文件中删除重复的单词。

如果您对使用Java从这样一个巨大的文件中删除重复单词的任何其他方法/方法有任何想法,请告诉我。非常感谢:)

添加信息到问题:我的话基本上是字母数字,它们是我们系统中唯一的ID。因此,它们不是简单的英语单词。


答案 1

使用合并排序并在第二次传递中删除重复项。您甚至可以在合并时删除重复项(只需将最新单词添加到RAM中的输出中,并将候选单词与它进行比较)。


答案 2

根据单词的第一个字母将大文件分成 26 个较小的文件。如果任何字母文件仍然太大,请使用第二个字母划分该字母文件。

使用 分别处理每个信函文件,以删除重复项。Set


推荐