免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5421 | 回复: 8
打印 上一主题 下一主题

对文本处理,shell,sed,awk和perl那个性能好呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-17 10:24 |只看该作者 |倒序浏览
本帖最后由 fikong2005 于 2011-05-17 16:41 编辑

目前需要准实时的对文件进行处理,然后入库,因为数据库性能已经不堪重负,因此在入库前对数据进行文件级别的过滤。
整个控制流程采用perl,但是对文件进行过滤是最耗时的工作,因此想问一下大虾门,采用shell,sed,awk和perl哪种对文本处理的性能会强悍一点。
主要的过滤功能如下:
A文件是详单(大概2G左右),B文件是维度(几十M),A文件根据B文件里面不存在的维度进行过滤。
如:
A文件:
A,DFSFD,FWFDG,DFSFDS
B,FDSFD,FSDFDS,FDSFER
C,FDSDRR,FDSDRG,DFDW
D,DRFSDR,FWRG,FDWRRD
B文件:
A
B
则过滤后,仅剩下:
A,DFSFD,FWFDG,DFSFDS
B,FDSFD,FSDFDS,FDSFER
请提供一下性能最优的核心代码,谢谢!;)

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-05-17 11:16 |只看该作者
性能估计差不多,都是最简单的 RE 匹配

论坛徽章:
0
3 [报告]
发表于 2011-05-17 11:23 |只看该作者
都不是底层的需求,我也认为性能会差不多,重要的是算法

论坛徽章:
0
4 [报告]
发表于 2011-05-17 12:28 |只看该作者
谢谢楼上2位,借问可否有比较佳的算法,呵呵。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-05-17 12:39 |只看该作者
你连个能跑的都还没写……
把 b 构建成 /^(?:A|B),/ 这样的 RE 和 A匹配下来过滤。如果真的 b 有那么简单你还可以用 c 来写个函数来扩展 Perl 怎么搞都行,但是最终你还是要测试才能知道哪个最优

论坛徽章:
0
6 [报告]
发表于 2011-05-17 15:11 |只看该作者
网上恰好有一段相关代码,如下:
#!/usr/bin/perl -w
exit if (1 > $#ARGV);

my %map_orig;

my $file_orig = shift @ARGV;
open FH, "<$file_orig" or die "can't open file: $file_orig";
while (<FH>) {
        chomp;
        #$map_orig{$_} = 1;
        my ($filed) = split(" ");
        $map_orig{$filed} = 1;
}
close (FH);

my $file_diff = shift @ARGV;
open FH, "<$file_diff" or die "can't open file: $file_diff";
while (<FH>) {
        chomp;
        my ($filed) = split(" ");
        print "$_\n" if (!defined$map_orig{$filed});
}
close (FH)


不知道效率如何,请赐教,谢谢!

论坛徽章:
0
7 [报告]
发表于 2011-05-17 17:15 |只看该作者
顶顶更健康。

论坛徽章:
0
8 [报告]
发表于 2011-05-17 23:12 |只看该作者
例子也是网上的,LZ敢情一句代码也不愿意写

我的想法是先读入文件B,构建一个Hash,然后查找这个Hash

既然B这么大,Shell一定会慢一些吧, 其他不知道谁会快,sed写起来简单些,我觉得

论坛徽章:
0
9 [报告]
发表于 2011-05-18 10:19 |只看该作者
"数据库性能已经不堪重负", 而且又要"準實時", 那你只能再弄個強悍的機器來進行文本處理了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP