免费注册 查看新帖 |

Chinaunix

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

Hash优化i [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-10-20 09:06 |只看该作者
原帖由 ttcn_cu 于 2009-10-19 17:36 发表
多进程 or 多线程
以多线程为例,为几个不同的文件处理过程创建线程,将内容保存在多个子哈希里
主线程等待子线程完毕后,合并子哈希表
.
.
.
抛砖引玉一下


还没用过多线程
有时间再尝试一下

论坛徽章:
0
12 [报告]
发表于 2009-10-20 09:50 |只看该作者
原帖由 HAHAPrince 于 2009-10-20 09:05 发表



是的
一行里只出现一个值.


偶也没太理解LZ的意思。
只search一个值就没必要用hash啦。
$count++不就行了么。

论坛徽章:
0
13 [报告]
发表于 2009-10-20 10:03 |只看该作者
要是换个思路呢 可以用占用更多的系统资源来换取速度。
具体方法:开始的%hash不初始化,然后把

while (<logFile>) {
                        while (my ($keytmp, $valuetmp) = each (%Hash)) {  
                                if(/\[$keytmp.*/){
                                        $Hash{$keytmp} = $Hash{$keytmp} + 1;
                                        print "$keytmp ==> $valuetmp\n";
                                }
                        }
                }


直接改成

while (<logFile>) {
      if(/\[(\S).*$/){
         $Hash{$1} ++;
      }
  }

这样就会制作出一个很大的hash表。你再从这个大hash表中找你要的那300个key的值。你可以试试 或许会快些。

论坛徽章:
0
14 [报告]
发表于 2009-10-20 11:51 |只看该作者
原帖由 兰花仙子 于 2009-10-20 09:50 发表


偶也没太理解LZ的意思。
只search一个值就没必要用hash啦。
$count++不就行了么。


修改过了,帮忙看看明白了吗?
就是每读取一行数据就和已经创建的hash里面的key 匹配, 如果匹配到了,那么这个key的value就加一.

论坛徽章:
0
15 [报告]
发表于 2009-10-20 11:59 |只看该作者
原帖由 machine 于 2009-10-20 10:03 发表
要是换个思路呢 可以用占用更多的系统资源来换取速度。
具体方法:开始的%hash不初始化,然后把

while () {
                        while (my ($keytmp, $valuetmp) = each (%Hash)) {  
              ...


把文件全部扫描了一次
怎么我这里hash只有一个 总数了

论坛徽章:
0
16 [报告]
发表于 2009-10-20 12:15 |只看该作者
原帖由 HAHAPrince 于 2009-10-20 11:51 发表


修改过了,帮忙看看明白了吗?
就是每读取一行数据就和已经创建的hash里面的key 匹配, 如果匹配到了,那么这个key的value就加一.


oh...在此情形下,如果用传统单进程方式做,效率怎么高也高不到哪里去,对每行文件,要遍历hash里的每个key.
但是,考虑预编译hash里的regex,可能会有所提高效率。

%hash = ( qr/key1/ => 0,
                 qr/key2/ => 0,);

在匹配时:

for (keys %hash) {
   $hash{$_} ++ if $line =~ $_;
}

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
17 [报告]
发表于 2009-10-20 12:26 |只看该作者

回复 #1 HAHAPrince 的帖子

关注

[ 本帖最后由 ttcn_cu 于 2009-10-20 12:31 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-10-20 12:26 |只看该作者
原帖由 兰花仙子 于 2009-10-20 12:15 发表


oh...在此情形下,如果用传统单进程方式做,效率怎么高也高不到哪里去,对每行文件,要遍历hash里的每个key.
但是,考虑预编译hash里的regex,可能会有所提高效率。

%hash = ( qr/key1/ => 0,
        ...



thanks.
有没有方法不需要遍历hash里的每个key呢?

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
19 [报告]
发表于 2009-10-20 12:27 |只看该作者
明白你所谓的低效在哪里了,

如果你再遍历LOG文件的每一样的时候再开循环遍历有效哈希Key是很慢的
不妨你先把有效哈希Key存在一个列表里面
当遍历LOG文件的时候,无论是否有效KEY都存在哈希表里
遍历LOG文件结束后,在循环有效哈希表,把对应的值取出来

论坛徽章:
0
20 [报告]
发表于 2009-10-20 13:46 |只看该作者
原帖由 ttcn 于 2009-10-20 12:26 发表
明白你所谓的低效在哪里了,

如果你再遍历LOG文件的每一样的时候再开循环遍历有效哈希Key是很慢的
不妨你先把有效哈希Key存在一个列表里面
当遍历LOG文件的时候,无论是否有效KEY都存在哈希表里
遍历LOG文件 ...



谢谢,我再尝试一下
是不是这样子
sub foo
{
my ( $login, $p, $uid, $gid, $gecos, $dir, $s );
my %HoH = ();
my $file = '/etc/passwd';
open( PASSWD, "< $file" ) or die "Can't open $file : $!";
while( <PASSWD> ) {
( $login, $p, $uid, $gid, $gecos, $dir, $s ) = split( ':' );
$HoH{ $login }{ 'uid' } = $uid;
$HoH{ $login }{ 'gid' } = $gid;
$HoH{ $login }{ 'dir' } = $dir;
}
close PASSWD;
return \%HoH;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP