java - 单词超过2亿时如何使用Java去除重复单词?

标签 java duplicate-removal

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

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

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

  1. 使用默认的 JVM 大小,Set 最多可以包含 0.7-080 万个单词,然后是 OutOfMemoryError。
  2. 使用 512M 的 JVM 大小,Set 最多可以包含 5-6 百万字,然后出现 OOM 错误。
  3. 在 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/

相关文章:

java - 这是对 Jenkins 的严重滥用吗?

java - 将 xml 从第 n 个元素拆分为第 x 个元素

Java 简单 ActionListener 问题

java - Q : Is embedding Java bad practice in BPEL?

linux - 如何在 Linux 中使用 Bash 脚本对这些值进行排序?

delphi - 如何删除列表框中的重复项?

mysql - 删除重复的行只留下最旧的行?

java - wait 和 wait 的时差?

PHP从数组中删除重复的对象

java - 删除重复的 ArrayList 自定义对象