我有一个文件(大小 = ~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。因此它们不是简单的英语单词。
最佳答案
使用 merge sort并在第二遍中删除重复项。您甚至可以在合并时删除重复项(只需将添加到 RAM 中的最新单词添加到输出中,并将候选词与其进行比较)。
关于java - 单词超过2亿时如何使用Java去除重复单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12501112/