大规模处理在非常大的字符串列表中找到唯一最长的单词?

时间:2014-01-24 05:52:50

标签: java hadoop mapreduce distributed

我在输入列表中找到了最长的非重复字符串。代码是here。我的问题是假设输入列表太大而无法放入内存中。

  1. 如果输入不能适合内存,如何解决这个问题(即假设输入是新闻纸的一个永无止境的字串)?

  2. 可以/如果是,那么如何使用Hadoop / Map减少概念(任何网址赞赏)

2 个答案:

答案 0 :(得分:3)

如果输入太大而无法放入内存,您有两个选择:

1)委托数据库或其他一些基于磁盘的结构。这在时间和资源方面将是昂贵的,但你会得到一个准确的答案

2)使用概率方法,例如Bloom filter,这是一种概率HashSet。这适用于Map Reduce,如下所示:

将输入<word>元组映射到<word, bloom_filter>个元组,其中word是尚未重复的最长字,bloom_filter是迄今为止发现的所有字的概率表示< / p>

然后,您可以通过比较两个<word, bloom_filter>长度来减少两个word元组,并在合并两个bloom_filter之前检查每个长度bloom_filter,注意这可能导致没有最长word - 这是非常有效的,如(dog, dog, plant, plant)的输入案例中所示。

答案 1 :(得分:2)

输入列表不需要留在内存中:你不能只将它流入吗?

至于使用MapReduce执行此类任务,请查看Data-Intensive Text Processing with MapReduce