我在输入列表中找到了最长的非重复字符串。代码是here。我的问题是假设输入列表太大而无法放入内存中。
如果输入不能适合内存,如何解决这个问题(即假设输入是新闻纸的一个永无止境的字串)?
可以/如果是,那么如何使用Hadoop / Map减少概念(任何网址赞赏)
答案 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。