-1

大きなファイルの 2 つの列 (列 a と列 b) の間で一致する値を見つけて、共通の値と対応する列 d を出力しようとしています。私はハッシュを介してこれを行ってきましたが、ファイルが非常に大きいため、出力ファイルを生成するのに十分なメモリがありません。より少ないメモリ リソースを使用して同じことを行う他の方法はありますか。

どんな助けでも大歓迎です。

これまでに作成したスクリプトは次のとおりです。

#!usr/bin/perl
use warnings;
use strict;

open (FILE1, "<input.txt") || die "$!\n Couldn't open input.txt\n";
open (Output, ">output.txt")||die "Can't Open output.txt ";
my $hash1={};
my $hash2={};

while (<FILE1>) {
    chomp (my $line=$_);
    my ($a, $b, $c, $d) = split (/\t/, $line);

    if ($a) {
        $hash1->{$a}{info1} = "$d"; #original_ID-> YOB
    }
    if ($b) {
        $hash2->{$b}{info2} = "$a"; #original_ID-> sire
    }

    foreach my $key (keys %$hash2) {
        if (exists $hash1{$a}) {
            $info1 = $hash1->{$a}->{info1};
            print "$a\t$info1\n";
        }
    }
}

close FILE1;
close Output;
print "Done\n";

明確にするために、入力ファイルは大きな家系図ファイルです。例は次のとおりです。

1    2   3   1977
2    4   5   1944
3    4   5   1950
4    5   6   1930
5    7   6   1928

出力ファイルの例は次のとおりです。

2   1944
4   1950
5   1928
4

1 に答える 1