通过数组优化的Java循环

通过数组优化的Java循环,java,string,for-loop,bioinformatics,fasta,Java,String,For Loop,Bioinformatics,Fasta,我有一些Java代码,运行方式完全符合预期,但它需要一些时间-几秒钟-即使作业只是在数组中循环 输入文件是一个Fasta文件,如下图所示。我使用的文件是2.9Mo,还有一些其他Fasta文件可能会占用20Mo 在代码中,我试图以三个一组的方式循环,例如:AGC TTT TCA。。。等等,代码现在没有功能传感器,但我想要的是将每个氨基酸附加到它的等效碱基串中。例如: AGC-Ser/CUG Leu/。。。等 那么代码有什么问题?有没有办法做得更好?有优化吗?在整个字符串中循环需要一些时间,可能只

我有一些Java代码,运行方式完全符合预期,但它需要一些时间-几秒钟-即使作业只是在数组中循环

输入文件是一个Fasta文件,如下图所示。我使用的文件是2.9Mo,还有一些其他Fasta文件可能会占用20Mo

在代码中,我试图以三个一组的方式循环,例如: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();
        }

    }

}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
公共类fasta{
公共静态void main(字符串[]args)引发IOException{
文件fastaFile;
文件阅读器;
BufferedReader fastaBuffer=null;
StringBuilder fastaString=新建StringBuilder();
试一试{
fastaFile=新文件(“res/NC_017108.fna”);
fastaReader=新文件读取器(fastaFile);
fastaBuffer=新的缓冲读取器(fastaReader);
字符串fastaDescription=fastaBuffer.readLine();
String line=fastaBuffer.readLine();
while(行!=null){
fastaString.append(行);
line=fastaBuffer.readLine();
}
System.out.println(fastaDescription);
System.out.println();
串电流快速酸;
对于(int i=0;i
如果您卸下

System.out.println(currentFastaAcid);
在for循环中,您将获得相当长的时间

如果移除

System.out.println(currentFastaAcid);

在for循环中,您将获得相当长的时间

这里的一个重要因素是,每次调用一个新字符串上的子字符串

相反,在stringbuilder上直接使用子字符串

for (int i = 0; i < fastaString.length(); i+=3){
    currentFastaAcid = fastaString.substring(i, i + 3);
    System.out.println(currentFastaAcid);
}
for(int i=0;i
此外,不是每次都打印currentFastaAcid,而是将其保存到列表中,并在末尾打印此列表

List<String> acids = new LinkedList<String>();

for (int i = 0; i < fastaString.length(); i+=3){
    currentFastaAcid = fastaString.substring(i, i + 3);
    acids.add(currentFastaAcid);
}

System.out.println(acids.toString());
List=newlinkedlist();
对于(int i=0;i
这里的一个重要因素是,每次调用一个新字符串上的子字符串

相反,在stringbuilder上直接使用子字符串

for (int i = 0; i < fastaString.length(); i+=3){
    currentFastaAcid = fastaString.substring(i, i + 3);
    System.out.println(currentFastaAcid);
}
for(int i=0;i
此外,不是每次都打印currentFastaAcid,而是将其保存到列表中,并在末尾打印此列表

List<String> acids = new LinkedList<String>();

for (int i = 0; i < fastaString.length(); i+=3){
    currentFastaAcid = fastaString.substring(i, i + 3);
    acids.add(currentFastaAcid);
}

System.out.println(acids.toString());
List=newlinkedlist();
对于(int i=0;i
除了调试输出之外,您的主要问题当然是,在循环的每次迭代中,您都在使用从文件中完全读取的数据创建一个新字符串:

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

toString()将在每次迭代中给出相同的结果,因此是多余的。把它放到循环之外,你肯定会在运行时节省一些时间。

除了调试输出之外,你的主要问题肯定是,在循环的每次迭代中,你都在用从文件中完全读取的数据创建一个新字符串:

currentFastaAcid = fastaString.toString().substring(i, i + 3);
currentFastaAcid = fastaString.toString().substring(i, i + 3);
toString()将在每次迭代中给出相同的结果,因此是多余的。把它放到循环之外,你肯定会在运行时节省一些时间

currentFastaAcid = fastaString.toString().substring(i, i + 3);
请替换为

currentFastaAcid = fastaString.substring(i, i + 3);
StringBuilder的toString方法每次调用它时都会创建String对象的新实例。它仍然包含所有大字符串的副本。如果直接从StringBuilder调用子字符串,它将返回子字符串的一个小副本。 如果您真的不需要System.out.println,也可以删除它

请替换为

currentFastaAcid = fastaString.substring(i, i + 3);
StringBuilder的toString方法每次调用它时都会创建String对象的新实例。它仍然包含所有大字符串的副本。如果直接从StringBuilder调用子字符串,它将返回子字符串的一个小副本。
如果您真的不需要System.out.println,也可以将其删除。

除了串行代码中建议的优化之外,我还将使用并行处理来进一步减少时间。如果您有一个非常大的文件,您可以将读取文件和处理读取行的工作分为不同的线程。这样,当一个线程忙于从大文件中读取下一行时,另一个线程可以处理读取的行并在控制台上打印它们。

除了串行代码中建议的优化外,我还将进行并行处理以进一步减少时间。如果您有一个非常大的文件,您可以将读取文件和处理读取行的工作分为不同的线程。这样,当一个线程忙于从大文件中读取下一行时,另一个线程可以处理读取的行并在控制台上打印它们。

我不知道,为什么花费的时间比预期的要长,我唯一能做的就是