Chinaunix

标题: Shell 中的执行效率 [打印本页]

作者: zenith518    时间: 2008-07-30 11:58
标题: Shell 中的执行效率
如何提高10M行文本处理的效率?
KSH快,还是BASH快?
在百万行数据中检索,用sed、grep和awk 那个更快些?

Bash中数组发现,10万号以上的数组成员访问就越来越慢了。
Ksh还没试过,谁有这方面的经验?
作者: 爱知    时间: 2008-07-30 12:08
只知道尽量减少I/O操作
作者: 可可熊    时间: 2008-07-30 12:12
grep 相对awk,sed要快。
操作简单的话可以考虑自己用C写程序。
作者: ddgfff    时间: 2008-07-30 12:20
我觉得awk速度快,但是占用cpu和内存瞬间数值会很高~
作者: wendaozhe    时间: 2008-07-30 12:20
原帖由 ddgfff 于 2008-7-30 12:20 发表
我觉得awk速度快,但是占用cpu和内存瞬间数值会很高~

正解!
作者: eeeef    时间: 2008-07-30 12:22
原帖由 ddgfff 于 2008-7-30 12:20 发表
我觉得awk速度快,但是占用cpu和内存瞬间数值会很高~


显然不对,grep速度最快,awk速度最慢
作者: liaosnet    时间: 2008-07-30 12:23
sed、grep 似乎比awk要快一些~~
作者: eeeef    时间: 2008-07-30 12:33
测试了一下,发现sed,awk,grep之间的速度比较很难说清楚。
作者: zenith518    时间: 2008-07-30 12:58
问一下,grep -E "aaa|bbb| . . ." filename 能连接多长,我怎么用20个就报toomany argument了,暴了?
作者: hansfly    时间: 2008-07-30 13:01
凑凑热闹,等正解。。。
作者: eeeef    时间: 2008-07-30 13:03
echo 123 | grep -E "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24"

我的还没暴。
作者: ddgfff    时间: 2008-07-30 13:44
原帖由 eeeef 于 2008-7-30 12:22 发表


显然不对,grep速度最快,awk速度最慢


sed是按照行来查找替换的,显然上千万行数据会耗时较多
grep主要用途是查找,可是处理文本也不能总用这个命令来只查找不处理吧,所以还是要把找到的东西传给其他命令去做,显然还是慢了
awk本身有查找匹配和对找到的数据操作的功能,而且awk本身是可编程的,可以说用awk本身的功能而非shell就可以搞定很多文本处理工作
作者: ailms    时间: 2008-07-30 13:45
gawk 应该是最快。

我用 awk 导入一个 37w 行的 ip 地址库,再查询 300w 个 ip ,只用 3秒
作者: zenith518    时间: 2008-07-30 15:26
一行长度不会暴,是我脚本自动生成命令行有问题,现已解决。
一次100个数据检索测试。

呵呵,我的场景中测试了一下。
sed(51732)             5秒  /千行
grep(85060)           8秒 /千行
gawk(320416)        25秒 /千行

看来还是sed的系统开销少很多啊,不过对于复杂操作,要有多次调用的还是,用gawk,调用一次全部搞定为好。
作者: ly5066113    时间: 2008-07-30 15:36
原帖由 zenith518 于 2008-7-30 15:26 发表
一行长度不会暴,是我脚本自动生成命令行有问题,现已解决。
一次100个数据检索测试。

呵呵,我的场景中测试了一下。
sed(51732)             5秒  /千行
grep(85060)           8秒 /千行
gawk(320416) ...


只查询的话,肯定是grep快。

原帖由 woodie 于 2006-8-18 16:57 发表

这个应该和locale有关,GNU的grep在多字节的locale下速度很慢。试比较:
LANG=en grep pattern
LANG=C grep pattern
和:
LANG=zh_CN grep pattern
速度差距之大令人咋舌。^_^
几年前就有人问过我这个问题,当时没找到原因。这次waker兄又提起,好好google了下,终于找到了答案。^_^
所以,以后大家用GNU grep时建议加上LANG=C。

作者: walkerxk    时间: 2008-07-30 16:30
原帖由 ly5066113 于 2008-7-30 15:36 发表


只查询的话,肯定是grep快。


加上LANG=C是查询中有[a-z]才会有用的吧,如果是grep abc的话有用么?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2