我有一个文件(大小约为1.9 GB),其中包含大约220,000,000(约220百万)个单词/字符串。它们有重复,几乎每100个单词就有1个重复。
在我的第二个程序中,我想读取该文件。我成功使用 BufferedReader 逐行读取了该文件。
现在要删除重复项,我们可以使用 Set(及其实现),但是 Set 存在问题,如下所述的3种不同情况:
- 使用默认的 JVM 大小,Set 最多可以包含0.7-0.8百万个单词,然后出现 OutOfMemoryError。
- 使用512M的 JVM 大小,Set 最多可以包含5-6百万个单词,然后出现 OOM 错误。
- 使用1024M的 JVM 大小,Set 最多可以包含12-13百万个单词,然后出现 OOM 错误。在添加1000万条记录到 Set 后,操作变得极其缓慢。例如,添加下一组 ~4000 条记录,需要60秒。
我有限制,不能进一步增加 JVM 大小,并且我想从这样一个巨大的文件中删除重复的单词。
请让我知道是否有任何其他方法/方法来使用 Java 从如此巨大的文件中删除重复的单词。非常感谢 :)
问题补充:我的单词基本上是字母数字,并且它们是我们系统中唯一的 ID。因此,它们不是纯英语单词。