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()这给它带来了另一个轻微的性能提升.
| 归档时间: |
|
| 查看次数: |
7883 次 |
| 最近记录: |