【问题标题】:AWK performance tune for writing multiple files用于写入多个文件的 AWK 性能调整
【发布时间】:2017-05-10 20:34:48
【问题描述】:
gawk -v ff=${fileB} '
    /^1017/ { print $0 >> ff; next; }
    !(/^#/||/^1016/||/^1018/||/^1013/||/^1014/||/^1013/||/^1014/) {
        f=substr($0,11,2)".csv"; print $0 >>"../../" f;
    }
' ${csvfiles}

大文件包含各种2000万行。如果它以1017开头,我们必须读取每一行,它将打印在fileB中,而与行内容无关 如果它不是从上面的跳过列表开始(1016,1013..),它将被写入文件,其中文件名取自行内容。例如这条线 1010,abcdefg,123453,343,3434, 写在 fg.csv 中。我们做子串并从第二列中取出 fg。

问题是性能就像每秒 35k 行。有没有可能让它更快?

sample input 
 Exclusion List 1016 1013 ..

 Include line number 1010,1017...

1016,abcdefg,123453,343,3434,

1010,abcdefg,123453,343,3434,

1017,sdfghhj,123453,343,3434,

1034,zxczcvf,123453,343,3434,

1055,zxczcfg,123453,343,3434,

sample output 

fileB.csv

1017,sdfghhj,123453,343,3434,

fg.csv

055,zxczcfg,123453,343,3434,

vf.csv

1034,zxczcvf,123453,343,3434,

【问题讨论】:

  • 拆分大文件,并行运行块,cat 将结果合并到一个文件中。
  • edit 您的问题并使用编辑器的{} 按钮来格式化您的示例输入/输出。还要具体说明您要排除哪些数字,并确保您的示例输入/输出和代码反映了这一点。

标签: performance awk cpu gawk


【解决方案1】:

试试这个:

gawk -v ff="$fileB" '
    !/^(#|10(1[6834]|24|55))/{ print > (/^1017/ ? ff : "../../" substr($0,20,2) ".csv") }
' "$csvfiles"

如果所有时间都花在文件打开/关闭上,这可能会加快速度:

awk '!/^(#|10(1[6834]|24|55))/{print substr($0,20,2), $0}' "$csvfiles" |
sort -t ' ' |
awk -v ff="$fileB" '
    {
        curr = substr($0,1,2)
        str  = substr($0,3)
        if ( index(str,"1017") == 1 ) {
            out = ff
        }
        else if ( curr != prev ) {
            close(out)
            out = "../../" curr ".csv"
            prev = curr
        }
        print str > out
    }
' "$csvfiles"

我真的不确定它是否会更快,但这可能是由于更简单的正则表达式,至少它很简洁。

【讨论】:

  • 您好,感谢您的帮助,我得到了更多的行起始编号,例如 1024,1055 等,有没有办法更改正则表达式以接受最后两位数字?
  • 看起来这些是完整的字段。等式检查应该比正则表达式更快。
  • @karakfa 可能是,但听起来好像有很多这样的 idk,例如,如果 20 个字符串比较会比 1 个正则表达式比较快,而且如果您不引用脚本然后 awk 在读取每条记录时不会进行字段拆分,因此您可以通过记录上的正则表达式比较与字段上的字符串比较来节省时间。
  • 是的,我没有考虑字段拆分,这可能会改变动态。另一方面,相等性检查将被短路,因此平均比较将小于最坏情况,并且可以在给定键分布的情况下进行优化。
  • 对,我的投票是把它作为 OP 的练习 :-)。我怀疑所有的文件写入(以及可能在打开/关闭它们的幕后管理)可能是花费时间的大部分,而不是比较。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多