私は、fastaファイルを読み込み、シーケンス(fasta)ファイルからすべての利用可能な(重複している)長さ15 k-mersを含むテキストファイルを出力しようとしています。このプログラムは重複していないk-mersを探しているときにはうまく動作しますが、重複しているk-mersを見つけるためにコード化した場合、実行するのにずっと時間がかかり、Cygwinは12時間後にkillされたプログラムを終了します。すべての重複するk-merを見つけて印刷する
#!/usr/bin/perl
use strict;
use warnings;
my $k = 15;
my $input = 'fasta.fasta';
my $output = 'text.txt';
my $match_count = 0;
#Open File
unless (open(FASTA, "<", $input)){
die "Unable to open fasta file", $!;
}
#Unwraps the FASTA format file
$/=">";
#Separate header and sequence
#Remove spaces
unless (open(OUTPUT, ">", $output)){
die "Unable to open file", $!;
}
while (my $line = <FASTA>){
my($header, @seq) = split(/\n/, $line);
my $sequence = join '', @seq;
while (length($sequence) >= $k){
$sequence =~ m/(.{$k})/;
print OUTPUT "$1\n";
$sequence = substr($sequence, 1, length($sequence)-1);
}
}
(私はその行を無視すること自由に感じなさい、合計をカウントするためにそこにmatch_countを残した)私が探しています結果は次のとおりです。事前に
A total of 20938309 k-mers printed in the text file when I use the wc -l command.
ありがとう!
kmerの合計数を探しているのですか、すべてのkmersを含むファイルが必要ですか? –
約20Mの部分文字列を生成することは、そのループがあまり効率的ではないにもかかわらず、* * *を取るべきではありません。どのくらいの大きさ(バイトとレコード)が入力ファイルですか? 大量の文字列変更を避けるために、最後の 'while'ループには次のものを使用することができます:' my $ i(0..length($ sequence) - $ k){ print OUTPUT substr i、$ k)、 "\ n"; } ' – mbethke
@ChrisCharleyすべてのkmersでファイルが必要です。私はwc -lコマンドを使って合計20m kmを確保するだけです。 – Kaiser