|
|||||||||||||||||||||||||||
Hejsa!
Jeg har et optimeringsspoergsmaal til perl.
Problem: Jeg har en stor fil (ca. 10 MB) fyldt af data af denne form:
0 xx0 yyx zz0
1 xx1 yy1 zz1
2 xx2 yy2 zz2
3 xx3 yy3 zz3
.
.
.
90 x90 y90 x90
0 xxx0 yyy0 zzz0
1 xxx1 yyy1 zzz1
.
.
.
90 xxxx90 yyyy90 zzzz90
Jeg skal have splittet denne fil op i 91 filer afhaengig af vaerdien i
den foerste soejle. Indtil nu har jeg gjort det ved at lave et
perlscript, der loeber filen igenne, og piller de linjer ud, der har en
bestemt vaerdi. Dette script har jeg saa koert (fra et andet perl-script)
91, og jeg kan ikke tro, at det kan betale sig fremfor at koere filen
igennem en enkel gang.
Er der nogen, der har forslag til at optimere det? Skal jeg aabne 91
filehandles, og saa skrive til dem undervejs?
Mvh,
Claus
Her er den nuvaerende kode, der kaldes 91 gange med forskellige vaerdier
af pos.
$pos = shift @ARGV;
$famsize = shift @ARGV;
if (!defined($pos) || !defined($famsize)) {
print "Must specify position and family size\n";
exit (1);
}
my $oldcode = -1;
open (FILE, "<ibd_dist.out") || die "Could not open GH-file\n";
while (<FILE>) {
if
(/([\-0-9\.]+)\s+([A-Za-z\-0-9]+)\s+([\-0-9]+),([\-0-9]+)\s+([0-9\.]+)\s+([0-9\.]+)\s+([0-9\.\
]+)\s+([0-9\.\-]+)\s+([0-9\.\-]+)\s+([0-9\.\-]+)/) {
my $filepos = int($1 + .1);
if ($filepos == $pos) {
my $fam = $2;
my ($id1, $id2) = ($3, $4);
my $ibd = $10 + 0.5*$9;
my $phi2= $7 + 0.5*$6;
$id1 =~ /(\d+)\-(\d+)/;
$code1 = $famsize*($1-1)+$2;
if ($oldcode != $code1) {
printf "%5d %5d %9.7f\n", $code1, $code1, 1.0;
$oldcode = $code1;
}
$id2 =~ /(\d+)\-(\d+)/;
$code2 = $famsize*($1-1)+$2;
if ($2 == $famsize) {
printf "%5d %5d %9.7f\n", $code2, $code2, 1.0;
}
printf "%5d %5d %9.7f\n", $code1, $code2, $ibd;
}
}
}
close(FILE);
|
||||||||||||||
|
||||||||||||||