0

予想どおりに実行される Java コードがいくつかありますが、ジョブが配列をループしているだけでも、ある程度の時間 (数秒) がかかります。

入力ファイルは、下の画像に示すように Fasta ファイルです。私が使用しているファイルは 2.9Mo で、最大 20Mo の Fasta ファイルがいくつかあります。

ここに画像の説明を入力

AGC TTT TCA ... などコードには機能的なセンスがありませんが、私が望むのは、各アミノ酸を対応する塩基の束に追加することです。例 :

AGC - Ser / CUG Leu / ...など

では、コードの何が問題なのですか? それをより良くする方法はありますか?最適化はありますか?文字列全体をループするには時間がかかりますが、おそらく数秒かかりますが、より良い方法を見つける必要があります。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class fasta {
    public static void main(String[] args) throws IOException {

        File fastaFile;
        FileReader fastaReader;
        BufferedReader fastaBuffer = null;
        StringBuilder fastaString = new StringBuilder();

        try {
            fastaFile = new File("res/NC_017108.fna");
            fastaReader = new FileReader(fastaFile);
            fastaBuffer = new BufferedReader(fastaReader);
            String fastaDescription = fastaBuffer.readLine();
            String line = fastaBuffer.readLine();

            while (line != null) {
                fastaString.append(line);
                line = fastaBuffer.readLine();
            }

            System.out.println(fastaDescription);
            System.out.println();
            String currentFastaAcid;

            for (int i = 0; i < fastaString.length(); i+=3) {
                currentFastaAcid = fastaString.toString().substring(i, i + 3);
                System.out.println(currentFastaAcid);
            }

        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            fastaBuffer.close();
        }

    }

}
4

5 に答える 5

1

シリアル コードで推奨される最適化とは別に、さらに時間を短縮するために並列処理を行います。非常に大きなファイルがある場合は、ファイルの読み取り作業と読み取り行の処理を別々のスレッドに分割できます。こうすることで、1 つのスレッドが大きなファイルから次の行を読み取るのに忙しいときに、別のスレッドが読み取り行を処理してコンソールに出力することができます。

于 2013-10-26T14:05:57.903 に答える
1

デバッグ出力以外の主な問題は、ループの各反復でファイルから完全に読み取ったデータを使用して新しい文字列を作成していることです。

currentFastaAcid = fastaString.toString().substring(i, i + 3);

fastaString.toString() は各反復で同じ結果を返すため、冗長です。ループの外に出れば、確実に数秒のランタイムを節約できます。

于 2013-10-26T13:55:07.660 に答える
0

を削除すると、

System.out.println(currentFastaAcid);

for ループの行で、かなりの時間を得ることができます。

于 2013-10-26T13:41:26.817 に答える