我有一个文件(大小 = ~1.9 GB),其中包含 ~220,000,000(~2.2 亿)个单词/字符串。他们有重复,每 100 个单词几乎有 1 个重复单词。
在我的第二个程序中,我想读取文件。我成功地使用 BufferedReader 逐行读取文件。
现在要删除重复项,我们可以使用 Set(及其实现),但是 Set 存在问题,如下面的 3 个不同场景中所述:
- 使用默认的 JVM 大小,Set 最多可以包含 0.7-080 万个单词,然后是 OutOfMemoryError。
- 使用 512M 的 JVM 大小,Set 最多可以包含 5-6 百万字,然后 OOM 错误。
- 使用 1024M 的 JVM 大小,Set 最多可以包含 12-1300 万个单词,然后 OOM 错误。在将 1000 万条记录添加到 Set 之后,操作变得非常缓慢。例如,添加下一个 ~4000 条记录需要 60 秒。
我有不能进一步增加 JVM 大小的限制,我想从文件中删除重复的单词。
如果您对使用 Java 从如此庞大的文件中删除重复单词有任何想法,请告诉我。非常感谢 :)
问题补充信息:我的话基本上是字母数字,它们是我们系统中唯一的 ID。因此,它们不是简单的英语单词。