我有一个文件(大小 = ~1.9 GB),其中包含 ~220,000,000(~2.2 亿)个单词/字符串。它们有重复,几乎每 100 个单词就有 1 个重复单词。
在我的第二个程序中,我想读取该文件。我成功使用 BufferedReader 逐行读取文件。
现在要删除重复项,我们可以使用 Set (及其实现),但 Set 有问题,如下 3 种不同场景所述:
- 使用默认的 JVM 大小,Set 最多可以包含 0.7-0.8 百万字,然后是 OutOfMemoryError。
- JVM大小为512M,Set最多可以包含5-6百万个单词,然后出现OOM错误。
- JVM大小为1024M,Set最多可以包含12-13百万个单词,然后出现OOM错误。这里在Set中添加1000万条记录后,运算变得极其缓慢。例如,添加接下来的约 4000 条记录,需要 60 秒。
我受到限制,无法进一步增加 JVM 大小,并且我想从文件中删除重复的单词。
如果您对使用 Java 从如此巨大的文件中删除重复单词的任何其他方式/方法有任何想法,请告诉我。非常感谢 :)
向问题添加信息:我的文字基本上是字母数字,它们是我们系统中唯一的 ID。因此它们不是简单的英语单词。
Use 归并排序 http://en.wikipedia.org/wiki/Merge_sort并在第二遍中删除重复项。您甚至可以在合并时删除重复项(只需将添加到输出的最新单词保留在 RAM 中,并将候选单词与其进行比较)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)