- 论坛徽章:
- 0
|
本帖最后由 hu_zhuang163 于 2013-07-25 16:56 编辑
Perl 使用 Archive::Tar读取 1G 的 Log文件 out of memory
系统环境: win7 使用的是activePerl 5.16.2
代码如下:-
-
- my $logFile = "E:\\a\\";
- my @zipFiles = glob $logFile . "log_*.tar.gz"or die "can't find/read tar.gz $logFile ";
- foreach (@zipFiles) {
- my $fileList = $_;
- my $tar = Archive::Tar->new;
- $tar->read($fileList);
- my @files = $tar->list_files;
- foreach my $logName (@files) {
- if ( $logName =~ m/tanx_*/ ) {
- $tar->extract_file( $logName, "tanxTemp.out" );
-
- open( DATA, "<", "tanxTemp.out" ) || die "cannot open the file: $!\n";
- while ( my $line = <DATA> ) {
- my @lineAry = split /,/, $line;
- my $ip = $lineAry[8];
- $tanxIPHash{$ip}="1";
- }
- close(DATA);
- }
-
- }
- }
复制代码 我大致知道原因 按照模块说明, 使用Archive::Tar这个模块 read 方法 是把所有的内容都读取到内存中在处理 , 可能就是这个导致的
然后我使用这样-
- my $next = Archive::Tar->iter( "example.tar.gz", 1, {filter => qr/\.pm$/} );
- while( my $f = $next->() ) {
- print $f->name, "\n";
- $f->extract or warn "Extraction failed";
- # ....
- }
复制代码 好像还是不行 ,哪位高手有处理大文件的经验的 ,求链接 |
|