【问题标题】:Cleaning doubles out of a massive word list清洁从庞大的单词列表中翻倍
【发布时间】:2011-06-16 09:28:46
【问题描述】:

我有一个 56GB 的单词表,我想删除双打。 我试图在 java 中解决这个问题,但在 250 万字之后我的笔记本电脑上的空间不足。 所以我正在寻找一个(在线)程序或算法,它可以让我删除所有重复项。

提前致谢, 巨魔爵士

编辑: 我在 java 中所做的是将它放在 TreeSet 中,以便对它们进行排序和删除重复

【问题讨论】:

  • 56GB?你确定有这么多的英文单词吗? oxforddictionaries.com/page/93
  • “我已经尝试在 java 中解决这个问题”——你忽略了提供任何关于你实际做了什么的线索。
  • @Sir,为什么不发布您当前的 java 解决方案和错误消息。 “我用完了空间”:这对我来说太模糊了。
  • @Sir Troll:哦,顺便说一句,那个用户名对你没有帮助。
  • 我只是从文件中读取它并将其放入 TreeSet 但是我在 java 中做了什么并不重要,因为与列表的大小相比,250 万字不算什么。并且错误是堆空间不足(obv)

标签: algorithm search text


【解决方案1】:

我认为这里的问题是数据量巨大。我会在第一步尝试将数据拆分为几个文件:例如为每个字符创建一个文件,例如将第一个字符为“a”的单词放入a.txt,第一个字符等于“b”放入b.txt。 ...

  • a.txt
  • b.txt
  • c.txt -

之后我会尝试使用默认排序算法并检查它们是否适用于文件的大小。分类后清理双打应该很容易。

如果文件仍然很大,您也可以使用超过 1 个字符进行拆分 例如:

  • aa.txt
  • ab.txt
  • ac.txt
  • ...

【讨论】:

    【解决方案2】:

    Mapreduce 或 Hadoop 等框架非常适合此类任务。您需要编写自己的 map 和 reduce 函数。虽然我确信这一定是以前做过的。在stackoverflow上快速搜索得到this

    【讨论】:

    • 我查看了以前带有“wordlist”标签的问题,但没有找到任何东西。感谢您的回答:) 我会检查出来
    【解决方案3】:

    我建议您为此使用Bloom Filter

    对于每个单词,检查它是否已经存在于过滤器中,否则插入它(或者,更确切地说是它的一些好的哈希值)。

    它应该是相当有效的,您不需要为它提供超过一两个 GB 的数据,它几乎不会出现误报。我把它留给你来计算。

    【讨论】:

    • 谢谢,会检查算法:)
    • 布隆过滤器:可能会出现误报,但不会出现误报。所以你可以错误地假设一个词存在并将它扔掉......不确定如何解决问题......
    【解决方案4】:

    我确实喜欢这里的分而治之的 cmets,但我必须承认:如果您在 2.5mio 单词上遇到问题,那么您的原始方法出了点问题。即使我们假设每个单词在这 2.5mio 中都是唯一的(这基本上排除了我们正在谈论的是自然语言中的文本)并且假设每个单词平均有 100 个 unicode 字符长,我们也有 500MB 用于存储唯一的字符串加上一些用于存储集合结构的开销。含义:你应该做得很好,因为这些数字已经被完全高估了。也许在安装 Hadoop 之前,您可以尝试增加堆大小?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多