私はファイル(fastaファイル)を扱っています。フォーマットは次のとおりです-
>chr1 AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC CAAACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTAAAAT TTTATCTTTAGGCGGTATGCACTTTTAACAAAAAANNNNNNNNNNNNNNNNNNNNNNNN nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn GCCCATCCTACCCAGCACACACACACACCGCTGCTAACCCCATACCCCGAAC CAACCAAACCCCAAAGACACCCCCCCAAGTTTATGTAGCTTACCTCNNNN >chrM GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT TTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTG GAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATT CTATTATTTATCGCACCTACGTTCAATATTTACAGGCGAACATACCTACTA AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT GTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAANAATTTCCACC
スライディング ウィンドウ アプローチを使用したい (非オーバーラップ ウィンドウ、サイズ = 50)。各文字の座標を 50bp ウィンドウで見つけたいのですが、N は含まれません。最初のchr1の出力は->
chr1 0 50 chr1 50 100 chr1 100 215 chr1 215 265
コードは -
use warnings;
*ARGV or die "No input file specified";
open *first, '<',$ARGV[0] or die "Unable to open input file: $!";
$start=1;
while(<first>) {
chomp;
if ( /(>)(\w)/ ) { #taking lines which have name of chromosome
@arr=split(">"); #splitting at ">" character and in $arr[1], there is chr name now
if (defined @array){
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
}
undef @array;
$length=0;
$non=0;
$start=0;
}
else {
@count=split(//, $_); #splitting each character in line
push(@array,@count); #storing each character in array till we find next chromosome
$chr=$arr[1];
}
}
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
問題は、私の fasta ファイルが大きく、このコードが大量のメモリと時間を消費していることです。より少ないメモリを使用して高速化する方法を教えてください。
ありがとう