免费注册 查看新帖 |

Chinaunix

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

[Hive] Perl 使用 Archive::Tar读取 1G 的 Log文件 out of memory [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-25 16:50 |只看该作者 |倒序浏览
本帖最后由 hu_zhuang163 于 2013-07-25 16:56 编辑

Perl 使用 Archive::Tar读取 1G 的 Log文件  out of memory
系统环境:  win7  使用的是activePerl 5.16.2

代码如下:
  1.        
  2.       
  3.      my $logFile   = "E:\\a\\";
  4.              my @zipFiles = glob $logFile . "log_*.tar.gz"or die "can't find/read tar.gz $logFile ";
  5.         foreach (@zipFiles) {
  6.                 my $fileList = $_;
  7.                                 my $tar = Archive::Tar->new;
  8.                                 $tar->read($fileList);
  9.                                 my @files = $tar->list_files;
  10.                                 foreach my $logName (@files) {
  11.                                         if ( $logName =~ m/tanx_*/ ) {
  12.                                                 $tar->extract_file( $logName, "tanxTemp.out" );
  13.        
  14.                                                 open( DATA, "<", "tanxTemp.out" ) || die "cannot open the file: $!\n";
  15.                                                 while ( my $line = <DATA> ) {
  16.                                                         my @lineAry  = split /,/, $line;
  17.                                                         my $ip = $lineAry[8];
  18.                                                          $tanxIPHash{$ip}="1";

  19.                                                 }
  20.                                                 close(DATA);
  21.                                         }
  22.                                        
  23.                                 }
  24.                 }


复制代码
我大致知道原因   按照模块说明, 使用Archive::Tar这个模块 read 方法 是把所有的内容都读取到内存中在处理 , 可能就是这个导致的

然后我使用这样
  1.        
  2. my $next = Archive::Tar->iter( "example.tar.gz", 1, {filter => qr/\.pm$/} );

  3.     while( my $f = $next->() ) {
  4.         print $f->name, "\n";

  5.         $f->extract or warn "Extraction failed";

  6.         # ....
  7.     }
复制代码
好像还是不行 ,哪位高手有处理大文件的经验的 ,求链接

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
2 [报告]
发表于 2013-07-25 16:52 |只看该作者
用while试试?

论坛徽章:
0
3 [报告]
发表于 2013-07-25 16:57 |只看该作者
看了模块说明

然后我使用了
    while( my $f = $next->() ) {
        print $f->name, "\n";

        $f->extract or warn "Extraction failed";

        # ....
    }

好像还是不行

回复 2# 只是一个红薯


   

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
4 [报告]
发表于 2013-07-25 17:02 |只看该作者
  foreach (@zipFiles) =>while(..)是改成这个不行吗
hu_zhuang163 发表于 2013-07-25 16:57
看了模块说明

然后我使用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP