免费注册 查看新帖 |

Chinaunix

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

对文件(列表)的查询及效率问题,请各位讨论下(暂时解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-15 19:27 |只看该作者 |倒序浏览
1.pl:

#!/usr/bin/perl -w

use strict;
use POSIX qw(strftime);

my $t1=strftime "%Y%m%d%H%H%S",localtime;
my $date=strftime "%Y%m%d",localtime;
my $log="/log${date}0000.dat";
chomp (my $ok=`/bin/grep 'Login OK' $log | wc -l`);
my $incorrect=`/bin/grep 'Login incorrect' $log | wc -l`;
open FILE,"> /log/radius_tongji.log" or die "$!";
print FILE $date . "\t" . $ok . "\t" . $incorrect;
close FILE;
my $t2=strftime "%Y%m%d%H%H%S",localtime;
print $t2-$t1 . "\n";



2.pl:
#!/usr/bin/perl -w

use strict;
use POSIX qw(strftime);

my ($ok,$incorrect);
my $t1=strftime "%Y%m%d%H%H%S",localtime;
my $date=strftime "%Y%m%d",localtime;
my $log="/log${date}0000.dat";
open FILE,"< $log" or die "$!";
while (<FILE>)
{
        $ok++ if /Login OK/i;
        $incorrect++ if /Login incorrect/i;
}
close FILE;
open FILE2,">> /log/radius_tongji.log" or die "$!";
print FILE2 $date . "\t" . $ok . "\t" . $incorrect . "\n";
close FILE2;
my $t2=strftime "%Y%m%d%H%H%S",localtime;
print $t2-$t1 . "\n";


运行1.pl花了13秒,运行2.pl花了22秒。
但感觉1.pl嵌套了shell效率不是很高,而2.pl是纯的perl语句,但效率不如1.pl.

请教各位,选择哪个呢?还有其他更好的办法吗?

[ 本帖最后由 gaochong 于 2009-6-16 16:49 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-06-15 20:48 |只看该作者
原帖由 gaochong 于 2009-6-15 19:27 发表
while (<FILE>)
{
        $ok++ if /Login OK/i;
        $incorrect++ if /Login incorrect/i;
}

但感觉1.pl嵌套了shell效率不是很高,而2.pl是纯的perl语句,但效率不如1.pl.

把  if /.../i 中的 i 去掉再比较下。

论坛徽章:
0
3 [报告]
发表于 2009-06-15 21:10 |只看该作者

回复 #2 MMMIX 的帖子

去掉 //i 中的i,效率是高了,但相比1.pl还是慢了1秒。 谢谢!

日志文件一般在500M到5G之间,我该选1.pl还是2.pl呢?或者有其他更好的code吗?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-06-15 21:23 |只看该作者
原帖由 gaochong 于 2009-6-15 21:10 发表
日志文件一般在500M到5G之间,我该选1.pl还是2.pl呢?

选 2,移植性要比 1 好很多。

论坛徽章:
0
5 [报告]
发表于 2009-06-15 22:04 |只看该作者
原帖由 gaochong 于 2009-6-15 21:10 发表
去掉 //i 中的i,效率是高了,但相比1.pl还是慢了1秒。 谢谢!

日志文件一般在500M到5G之间,我该选1.pl还是2.pl呢?或者有其他更好的code吗?



你再加个  next 试试

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
6 [报告]
发表于 2009-06-15 22:15 |只看该作者

回复 #1 gaochong 的帖子

调用shell命令是有一些开销
不过grep可是相当快

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
7 [报告]
发表于 2009-06-15 22:19 |只看该作者
原帖由 cobrawgl 于 2009-6-15 22:04 发表



你再加个  next 试试

赞同 如果一行不可能同时有Login incorrect和Login OK
那么LZ做了多余的比较

论坛徽章:
0
8 [报告]
发表于 2009-06-15 22:28 |只看该作者

回复 #4 MMMIX 的帖子

我试了一个846M的文件,跑1.pl花了29秒,跑2.pl花了30秒,而且2.pl的负载相对更高。不知道3G\4G的文件会怎样,明天试试看。

但遇到一个问题:怎么会跑出下边的结果呢?应该是$t2>$t1才对。怎么是这样了呢?

-bash-3.00$ ./2.pl
20090615222242
20090615222212
-30

论坛徽章:
0
9 [报告]
发表于 2009-06-15 22:42 |只看该作者
原帖由 yecheng_110 于 2009-6-15 22:19 发表

赞同 如果一行不可能同时有Login incorrect和Login OK
那么LZ做了多余的比较


日志文件中,一行不可能同时又OK和incorrect。但我是要统计OK和incorrect的行数,所以不是多余的比较。

为什么要加next ???没明白2位的意思。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2009-06-15 23:20 |只看该作者
原帖由 gaochong 于 2009-6-15 22:42 发表


日志文件中,一行不可能同时又OK和incorrect。但我是要统计OK和incorrect的行数,所以不是多余的比较。

为什么要加next ???没明白2位的意思。

写成

  1. while (<FILE>)
  2. {
  3.         if (/Login Ok/) {
  4.             $ok++;
  5.             next;
  6.         }
  7.         $incorrect++ if /Login incorrect/i;
  8. }
复制代码

这下明白了吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP