0

おはようございます、解決すべき質問がいくつかあります...私の質問に答えていただけるかどうか見てみましょう。

ヌクレオチド (fasta ファイル) を含む .txt があります。各行には 124 のヌクレオチドが含まれており、4 ヌクレオチドのコドンを読み取る必要があります (はい、実際にはコドンは 3 ヌクレオチドで構成されていますが、ここでは 4 x 4 を読み取る必要があります)。124 は 4 の倍数なので、問題ありません。

このループでは、5 秒以内に 5 つのファイル出力を作成します。

sub sequence() {
    foreach $line (<SEQ>) {
        next if (index($line, ">") != -1);
        some actions........

しかし、各行が 4 の倍数でない場合はどうなるでしょうか。各行の長さが 125 ヌクレオチドの場合はどうなりますか? このメカニズムをテストしました(すべての行を結合し、最初の行を無視します):

sub sequence() {                        #Joining lines from the sequence.
    $one = "";
    while ($line = <SEQ>) {
        next if (index($line, ">") != -1);
        chomp $line;
        $one .= $line; }

しかし、50秒かかります!!! 私の最初の5秒の代わりに。

上記のコードの代わりに$one、次のコードも試しましたが、約50秒かかります....

$contents = do { local $/;  <SEQ> };
$contents =~ s/\A.*?\n//;
$contents =~ tr/\n//;

それで、私のスクリプトをより速くするための提案はlength($line) % 4 !=0???

ありがとう!

4

1 に答える 1

0

あなたの文字列はおそらく長すぎます。文字列全体をロードしてから処理する代わりに、未処理のテキストの文字列バッファを維持してみてください。

  • 文字列を開始するために行を読み取ります (それを と呼びましょう$remaining_codons)
  • 次の 4 つのコドン (表示されていないコード) を読み取りremoveます$recent_codons。一度に 4 つのできるだけ多くのコドンを消費し、残りの 0 ~ 3 つのコドンを返す「do stuff」セクションのメソッドを使用することで、これを簡単に行うことができます。
  • 残りのコドンが 4 つ未満になると、次のようになります。
    • 不可能な場合は、新しい行または終了を読み取ろうとします
    • 残りの項目に改行を追加
    • 一度に 4 つのコドンの読み取りを繰り返します

最初のコード構造を再利用するとどうなるか

sub sequence() {
    my $remaining_codons = '';
    foreach $line (<SEQ>) {
        next if (index($line, ">") != -1);
        $remaining_codons = $remaining_codons . $line;
        while ( length($remaining_codons) > 3 ) { 
           my $next_codons = substr( $remaining_codons, 0, 4 ); 
           $remaining_codons = substr( $remaining_codons, 4 ); 
           # Do stuff
        }
于 2013-11-07T08:14:26.240 に答える