【发布时间】:2012-06-27 05:43:39
【问题描述】:
我正在使用 gawk 浏览一个大型文本语料库(大约 3-4GB,电子书汇编),以便打印出至少出现 3 次的 3 个单词的每个关联,以生成语言统计数据。代码如下:
file.awk 的内容:
BEGIN { RS="[^[:alnum:]]+" }
{ w1 = w2; w2 = w3; w3 = $0 }
NR > 2 { count[tolower(w1 " " w2 " " w3)]++ }
END {
for (phrase in count) {
if (count[phrase] >= 3) {
print phrase, count[phrase]
}
}
}
命令:gawk -f file.awk mytxtfile > 输出
它适用于小文件(几百 MB),但我无法让它适用于大于 1GB 的文件:gawk 在不到一分钟的时间内吃掉了我所有的 RAM(8GB),然后开始吃掉我的交换和整个系统最终会死机。
您知道我如何优化代码,即使最终需要更长的时间吗?
非常感谢
【问题讨论】:
-
虽然一个全傻瓜式的解决方案会很优雅,但也许 unix 管道可以帮助你,即
awk '{print all 3 wrd sets}' | sort | uniq -c | awk '$1>2{print}'或类似的。祝你好运。 -
另一种方法是将密钥存储在数据库中,因此您无需将它们保存在内存中。不过,这超出了您可以方便地使用
awk做的事情;但也许会转移到例如Python 不会是一个难以克服的复杂问题。 -
这个主意不错,我要试一试,谢谢 shellter
-
谢谢 Tripleee,我会调查一下
-
bobylapointe,请您发布示例 Input_file 和预期输出。我很确定我们可以通过看到这一点提供更多帮助。