修改PERL脚本以便以更高的速度消耗更少的内存

时间:2016-09-24 08:22:43

标签: perl

我编写了一个脚本,用于比较多个文件并给出每个文件中每个段落的出现次数。该脚本可以正常使用较小的文件,但是当应用于大文件时,程序将无法输出。我需要一些帮助来修改脚本,以便它可以在所有文件上运行,即使它非常大。我的剧本:

#!/usr/bin/env perl
use strict;
use warnings;
no warnings qw( numeric );
my %seen;

$/ = "";
while (<>) {
    chomp;
    my ($key, $value) = split ('\t', $_);

    my @lines = split /\n/, $key;
    my $key1 = $lines[1];

    $seen{$key1} //= [ $key ];
    push (@{$seen{$key1}}, $value);
}

my $tot;
my $file_count = @ARGV;
while ( my ( $key1, $aref ) = each %seen ) {
    $tot = 0;
    for my $val ( @{ $aref } ) {
        $tot += $val;
    }
    if ( @{ $aref } >= $file_count ) {
        print join "\t", @{ $aref };
        print "\tcount:". $tot."\n\n";
    }
}

我正在提供样本文件,以便更好地了解情况。 data1.txt和data2.txt包含我的数据样本。如果每个读取的第二行匹配,那么我需要将所有文件中读取的次数相加,即输出两个文件应该如output.txt中所示:

**data1.txt**

@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
=CCGGGCGGG1GGJJCGJJCJJJCJJGGGJJGJGJJJCG8JGJJJJ1JGG8=JGCJGG$G     1 :data1.txt

@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJ>JJJGGG8$CGJJGGCJ8JJ     3 :data1.txt

@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJJJJJGGG8$CGJJGGCJ8JJ     2 :data1.txt

**data2.txt**

@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
AAAAA#EEEEEEEEEEEEEEEE6EEEEEAEEEAE/AEEEEEEEAE<EEEEA</AE<EE   1 :data2.txt

@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
AAAAA#E/<EEEEEEEEEEAEEEEEEEEA/EAAEEEEEEEEEEEE/EEEE/A6<E<EEE  2 :data2.txt

@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
AAAAA#EEEEEEEEAEEEEEEEEEEEEEEEEEEEEAEEEEEEEE/EEEAE6AE<EAEEAE     2 :data2.txt

**output.txt**

@NS500278
AGATCNGAAGAGCACACGTCTGAACTCCAGTCACAACGTGATATCTCGTATGCCGTCTTC
+
=CCGGGCGGG1GGJJCGJJCJJJCJJGGGJJGJGJJJCG8JGJJJJ1JGG8=JGCJGG$G     1 :data1.txt    1 :data2.txt   count:2

@NS500278
CATTGNACCAAATGTAATCAGCTTTTTTCGTCGTCATTTTTCTTCCTTTTGCGCTCAGGC
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJ>JJJGGG8$CGJJGGCJ8JJ     3 :data1.txt    2 :data2.txt   count:5

@NS500278
TACAGNGAGCAAACTGAAATGAAAAAGAAATTAATCAGCGGACTGTTTCTGATGTTATGG
+
CCCGGGGGGGGGGJGJJJJJJJJJJJJJGJG$JJJJ$GGJJJJJGGG8$CGJJGGCJ8JJ     2 :data1.txt    2 :data2.txt   count:4

我试图将我的哈希绑定到文件但无法理解该概念。如果有人能用一个简短的例子解释解决方案,那将是非常有帮助的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为规模问题更受关注,正如其他人在评论中所说的那样。将怪物哈希绑定到磁盘应该是解决问题的下一步。请参考perltie,如果您想要一个示例,this Perl Cookbook script应该有用。如果我的内存服务,Berkeley DB中的密钥和值都可以容纳4千兆字节,这应该足以满足您的需求。顺便说一句,这种方法的一个很好的副作用是你可以轻松地重复使用以前的结果。