免费注册 查看新帖 |

Chinaunix

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

perl对大文件的处理效率问题 [复制链接]

论坛徽章:
1
白羊座
日期:2014-11-19 14:18:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-22 09:56 |只看该作者 |倒序浏览
看到这样一个文章:
C/C++/Perl/汇编/Java效率比较
http://blog.csdn.net/jia_xiaoxin/archive/2008/10/02/3009173.aspx

从指定文本文件中搜索指定字符串,计算个数。并且打印出搜索到的个数作为结果输出。准备了一个多达2G的文本文件,总共有文本1500万行多。
#!/usr/bin/perl
$filename="d:\access.log_";
$count = 0;
open(FILE , "<$filename");
while(<FILE>)
{
@match_list = ($_ =~ /HIT/g);
$count=$count+@match_list;
}
close(FILE);
print "Count = $count ";
exit
作者测试,使用PERL5.8解释器,用了8分18秒08完成了1500万行文本的扫描,并得出了正确的结果。

虽然我用perl比较少,但效率不至于这么低吧。这个程序如何优化呢

论坛徽章:
0
2 [报告]
发表于 2010-12-22 10:07 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-12-22 10:19 编辑

这白痴用了最低效的写法,纯一perl黑

论坛徽章:
0
3 [报告]
发表于 2010-12-22 10:29 |只看该作者
哪个白痴作者?

论坛徽章:
0
4 [报告]
发表于 2010-12-22 10:32 |只看该作者
高手给个高效的代码啊!!

论坛徽章:
0
5 [报告]
发表于 2010-12-22 10:41 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-12-22 10:50 编辑
  1. #!/bin/env perl

  2. use strict;
  3. use warnings;

  4. my $filename = "D:/access.log_";
  5. my $count = 0;
  6. open(FILE, "<:raw", $filename) or die $^E;
  7. local $_;
  8. while (my $line = <FILE>)
  9. {
  10.         $_ = -1;
  11.         $count++ while (($_ = index($line, "HIT", $_ + 1)) != -1);
  12. }

  13. close FILE;

  14. print "Count = ", $count, "\n";
  15. exit(0);
复制代码
要更快可以用 sysread

论坛徽章:
0
6 [报告]
发表于 2010-12-22 11:13 |只看该作者
回复 5# 黑色阳光_cu


    第13行:

$count++ while (($_ = index($line, "HIT", $_ + 1)) != -1);

如果 HIT 出现在开头呢?那么index返回的是0,count就不会自加了。

论坛徽章:
0
7 [报告]
发表于 2010-12-22 11:28 |只看该作者
回复 5# 黑色阳光_cu


    上面那句代码我理解错了,你是对的,抱歉。。。

论坛徽章:
0
8 [报告]
发表于 2010-12-22 16:12 |只看该作者
是不是index比m//g快啊?

论坛徽章:
0
9 [报告]
发表于 2010-12-22 17:24 |只看该作者
  NO   慢得这么夸张肯定是碰到内存瓶颈

论坛徽章:
0
10 [报告]
发表于 2010-12-22 17:43 |只看该作者
是不是index比m//g快啊?
nb509 发表于 2010-12-22 16:12


我记得正则表达式要比index之类的慢一点点.小数据量看不出来,如果很大就看出来了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP