如何处理大文本文件(约300M)

时间:2013-08-12 14:02:23

标签: algorithm data-structures text-files word-count divide-and-conquer

有一个文本文件(大约 300M ),我需要计算十个最常见的单词(一些停用单词被删除)。测试机有8个核心和Linux系统,欢迎任何编程语言,只能使用开源框架(hadoop 一个选项),我没有任何mutithread编程经验,我在哪里可以从尽可能少的时间开始,如何给解决方案成本?

4 个答案:

答案 0 :(得分:0)

300M对你的任务来说不是什么大问题,即使对于像python这样的高级解释语言进行单核处理也是如此。与许多低级语言相比,Python的优势在于它可以使您的字数统计编程非常容易编码和调试。如果你仍然希望并行化(即使在python中运行单核只需要几秒钟),我相信有人可以发布一种快速简便的方法来实现它。

答案 1 :(得分:0)

假设每行有1个单词,您可以在 python

中执行以下操作
from collections import Counter

FILE = 'test.txt'
count = Counter()

with open(FILE) as f:
    for w in f.readlines():
        count[w.rstrip()] += 1

print count.most_common()[0:10]

答案 2 :(得分:0)

读取文件并创建所有出现的单词的地图 [Word,count] 作为键,值是您在阅读时出现的单词数。

任何语言都可以胜任。

阅读文件一次后,你就有了地图。

然后遍历地图并记住具有最高计数值的十个单词

答案 3 :(得分:0)

如何以良好的可扩展性解决此问题:

问题可以通过2 map-reduce步骤来解决:

第1步:

map(word):
   emit(word,1)
Combine + Reduce(word,list<k>):
   emit(word,sum(list))

完成此步骤后,您会看到(word,#occurances)

的列表

第2步:

map(word,k):
   emit(word,k):
Combine + Reduce(word,k): //not a list, because each word has only 1 entry.
   find top 10 and yield (word,k) for the top 10. //see appendix1 for details

在第2步中,您必须使用单个reducer,问题仍然可以扩展,因为它(单个reducer)只有10*#mappers个条目作为输入。


300 MB文件的解决方案:

实际上,300MB不是一个如此大的文件,所以你可以创建一个histogram(在内存中,使用基于树/哈希的映射),然后从中输出前k个值。

使用支持并发的映射,您可以将文件拆分为多个部分,并让每个线程在需要时修改它。请注意,如果实际有效分割驾驶室是依赖于FS的,有时必须通过一个线程进行线性扫描。


<强>附录1:
如何获得前k:

使用min heap并迭代元素,min heap将始终包含最高的K元素。

Fill the heap with first k elements.
For each element e:
     If e > min.heap():
         remove the smallest element from the heap, and add e instead.

此外,more details in this thread