【问题标题】:gawk running out of memory when going through large files: can i optimize my code?gawk 在浏览大文件时内存不足:我可以优化我的代码吗?
【发布时间】: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 和预期输出。我很确定我们可以通过看到这一点提供更多帮助。

标签: memory gawk corpus


【解决方案1】:

只要您需要将信息保留到最后,您的记忆要求就是 O(ordered 3 词组合的数量) — 关于 200K words 的意思8,000,000,000,000,000 种组合...

即使您的图书的组合词汇量要小得多(例如,只有 50K 单词),也仍然是 50K^3 或 1.25*10^14。然后,即使您的 awk 实现每个条目仅使用 16 个字节(不可能),这仍然是 2,000,000,000,000,000 个字节 - 或 2000TB。

这是最坏的情况——但你看,你在玩什么数量级。

也许,您不需要订购单词组合?在这种情况下,您可以通过首先对单词进行排序来将数组条目的数量减少 6 倍。但我怀疑,这对你也有帮助......

【讨论】:

    【解决方案2】:

    您的解决方案在字符串方面效率不高:它为每个唯一的三元组分配一个,并且在大型语料库中,它们有很多。相反,您可以设置一个带有树索引的表并执行count[w1][w2][w3]++。最后需要做更多的工作,但现在每个唯一标记只有一个字符串。

    如果这还不够好,您始终可以在较小的文本组上运行代码,对输出进行排序,然后合并它们。

    顺便说一句,我猜你的代码很简陋,或者你是否在前面提到句尾标记之类的东西?

    该死,我正在回答一个 6 岁的问题。

    【讨论】:

      猜你喜欢
      • 2016-02-06
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多