如何使这个sed脚本更快?

ero*_*ppa 9 unix linux performance sed

我继承了这个尝试删除某些空格的sed脚本片段:

s/[\s\t]*|/|/g
s/|[\s\t]*/|/g
s/[\s] *$//g
s/^|/null|/g
Run Code Online (Sandbox Code Playgroud)

它运行在大约1Gb的文件上.此脚本在我们的unix服务器上运行2个小时.任何想法如何加快它?

注意\ s代表空格而\ t代表制表符,实际脚本使用实际空格和制表符而不是那些符号

输入文件是管道分隔文件,位于本地而非网络上.这4行是在用sed -f执行的文件中

Dan*_*ing 29

我能用sed做的最好的就是这个脚本:

s/[\s\t]*|[\s\t]*/|/g
s/[\s\t]*$//
s/^|/null|/
Run Code Online (Sandbox Code Playgroud)

在我的测试中,这比你的sed脚本快了大约30%.性能的提高来自前两个regexen和省略不需要的"g"标志.

但是,快30%只是一个温和的改进(在你的1GB数据文件上运行上面的脚本仍然需要大约一个半小时).我想看看能不能做得更好.

最后,我尝试的其他方法(awk,perl和其他方法与sed)没有任何好转,除了 - 当然 - 一个普通的'C'实现.正如C所预期的那样,代码在这里发布有点冗长,但是如果你想要一个可能比其他方法更快的程序,你可能想看看它.

在我的测试中,C实现在你的sed脚本花费大约20%的时间内完成.因此,在Unix服务器上运行可能需要大约25分钟左右.

我没有花太多时间来优化C实现.毫无疑问,有很多地方可以改进算法,但坦率地说,我不知道是否有可能削减超出它已经实现的时间.如果有的话,我认为它肯定会对你可以从其他方法(sed,awk,perl,python等)中获得什么样的性能设置一个上限.

编辑:原始版本有一个小错误,导致它可能在输出的末尾打印错误的东西(例如,可以打印不应该在那里的"空").今天我有一段时间看一看并解决了这个问题.我还优化了一个调用,strlen()这给它带来了另一个轻微的性能提升.

  • 为了实现更快的解决方案和正确测试它而不仅仅是假设它会更快,大量工作的+1. (3认同)