我得到了56GB的单词表,我想删除双打。 我试图在java中解决这个问题,但是我的笔记本电脑上的空间耗尽了2.5M。 所以我正在寻找一个允许我删除所有副本的(在线)程序或算法。
提前致谢, 特罗尔爵士
编辑: 我在java中所做的是把它放在TreeSet中,这样就可以对它们进行排序并删除重复的
答案 0 :(得分:2)
Mapreduce或Hadoop等框架非常适合此类任务。您需要编写自己的地图并减少功能。虽然我确信这一定是以前做过的。快速搜索stackoverflow给了this
答案 1 :(得分:2)
我认为这里的问题是数据量巨大。我会在第一步尝试将数据拆分为多个文件:例如为每个字母创建一个文件,例如将第一个字符为'a'的单词放入a.txt,第一个字符等于'b'到b.txt。 ......
之后我会尝试使用默认排序算法,并检查它们是否与文件大小一致。排序后清理双打应该很容易。
如果文件仍然很大,您也可以使用超过1个字符进行拆分 e.g:
答案 2 :(得分:1)
我建议你使用Bloom Filter。
对于每个单词,检查它是否已经存在于过滤器中,否则将其插入(或者更确切地说是一些好的哈希值)。
它应该是相当有效的,你不应该为它提供超过一千兆字节或几千字节,因为它实际上没有假阴性。我留给你来计算数学。
答案 3 :(得分:0)
我确实喜欢这里的分而治之的评论,但我不得不承认:如果你遇到了2.5米字的问题,那么你的原始方法就会出现问题。即使我们假设每个单词在那些单词内都是唯一的(这基本上排除了我们所说的是自然语言中的文本)并且假设每个单词平均长度为100个unicode字符,我们的存储空间为500MB唯一字符串加上一些用于存储集合结构的开销。含义:你应该做得很好,因为这些数字已经完全被高估了。也许在安装Hadoop之前,你可以尝试增加堆大小?