免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gaochong
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2009-06-15 23:32 |只看该作者

回复 #10 MMMIX 的帖子

哎呀,晕了。非常明白了,谢谢2位!


但实际跑了一下,加和不加,都跑了30秒。从代码上分析,应该是加next会节省时间但结果却没有。

论坛徽章:
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
12 [报告]
发表于 2009-06-15 23:57 |只看该作者
原帖由 gaochong 于 2009-6-15 23:32 发表
哎呀,晕了。非常明白了,谢谢2位!


但实际跑了一下,加和不加,都跑了30秒。从代码上分析,应该是加next会节省时间但结果却没有。

next 实际能不能节省时间和你输入的数据有关,如果每次 if (/Login OK/) 都失败的话,加 next 和不加 next 效率不会有什么差别;但如果在大多数情况下 if (/Login OK/) 都成功,加上 next 应该能快不少。

论坛徽章:
0
13 [报告]
发表于 2009-06-16 09:15 |只看该作者

回复 #12 MMMIX 的帖子

谢谢了!

成功和失败的数量:20090527        293163  3319309

Login incorrect匹配的多,但效率还是一样,也是用了30秒。

while (<FILE>)
{
        if (/Login incorrect/) {
                $incorrect++;
                next;
        }
        $ok++ if /Login OK/;
}

论坛徽章:
0
14 [报告]
发表于 2009-06-16 10:25 |只看该作者

回复 #13 gaochong 的帖子

如果只有Login incorrect和Login OK两种可能性,那么可以这样写,看看速度是否有提高 :)
  1. while (<FILE>)
  2. {
  3.         if (/Login incorrect/) {
  4.                 $incorrect++;
  5.                 next;
  6.         }
  7.         $ok++;
  8. }
复制代码

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

回复 #14 yashiro_lj 的帖子

谢谢,但不是只有这2个可能。

我的日志格式如下:
Thu Jan 15 10:02:10 2009 : Auth: Login incorrect: [ac/d] (from client)
Thu Jan 15 10:02:12 2009 : Error: Username [ac] Reject Message
Thu Jan 15 10:02:12 2009 : Auth: Login incorrect: [ac/b] (from client)
Thu Jan 15 10:02:15 2009 : Auth: Login OK: [ab/c] (from client)

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

回复 #15 gaochong 的帖子

楼主看看日志格式,能否只匹配incorrect和OK,少匹配几个字母在理论上来说应该会快些

论坛徽章:
0
17 [报告]
发表于 2009-06-16 10:41 |只看该作者

回复 #15 gaochong 的帖子

为了寻求可能更高的效率,我想到了grep,写了3.pl如下:

#!/usr/bin/perl -w

use strict;
use POSIX qw(strftime);

my $t1=strftime "%Y%m%d%H%H%S",localtime;
print "$t1\n";
#my $date=strftime "%Y%m%d",localtime;
my $date=20090527;
my $log="/logs/log${date}0000.dat";
open FILE,"< $log" or die "$!";
my @list=grep /Login OK/,<FILE>;
close FILE;
open FILE_t,"< $log" or die "$!";
my @list2=grep /Login incorrect/,<FILE_t>;
close FILE_t;
open FILE2,">> /export/home/gaochong/radius_tongji.log" or die "$!";
print FILE2 $date . "\t" . scalar @list . "\t" . scalar @list2 . "\n";
close FILE2;
my $t2=strftime "%Y%m%d%H%H%S",localtime;
print "$t2\n";
print $t2-$t1 . "\n";



从程序上分析,I/O次数多了一次,效率可能会更低。
但我运行./3.pl ,却好像僵死一样,跑了1分钟还没有结果。

是因为I/0的问题吗?

论坛徽章:
0
18 [报告]
发表于 2009-06-16 10:43 |只看该作者

回复 #13 gaochong 的帖子

这个感觉有点奇怪,按照理论上来说,绝大部分login都是失败的,那么第一个if判断完之后就next到下次循环了,理论上来说这种写法的速度肯定要比$ok++ if /Login OK/放在前面要快的,但楼主实际跑的结果却是一样的。哪位大侠能否解释一下?

论坛徽章:
0
19 [报告]
发表于 2009-06-16 10:48 |只看该作者

回复 #17 gaochong 的帖子

你这样写就等于循环了2次(一次用于检查incorrect,一次用于检查OK),效率上估计还比不上只while循环一次呢。

  1. my @list=grep /Login OK/,<FILE>;
复制代码

这样写会把整个<FILE>当做一个列表一次性都读入内存的,如果文件过大,肯定就卡住了

论坛徽章:
0
20 [报告]
发表于 2009-06-16 10:50 |只看该作者

回复 #16 yashiro_lj 的帖子

是的。

我用如下代码,却跑了38秒!!!比原来的30秒效率更低了。
while (<FILE>)
{
        if (/\bincorrect\b/) {
                $incorrect++;
                next;
        }
        $ok++ if /\bOK\b/;
}

去掉锚点,花了29秒,和之前的code效率基本持平。但去掉锚点可能会有偏差,比如有 abOKc.

自己的结论:锚点降低了查询效率。  请各位指正。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP