通过数组优化的Java循环
我有一些Java代码,运行方式完全符合预期,但它需要一些时间-几秒钟-即使作业只是在数组中循环 输入文件是一个Fasta文件,如下图所示。我使用的文件是2.9Mo,还有一些其他Fasta文件可能会占用20Mo 在代码中,我试图以三个一组的方式循环,例如:AGC TTT TCA。。。等等,代码现在没有功能传感器,但我想要的是将每个氨基酸附加到它的等效碱基串中。例如: AGC-Ser/CUG Leu/。。。等 那么代码有什么问题?有没有办法做得更好?有优化吗?在整个字符串中循环需要一些时间,可能只需要几秒钟,但需要找到更好的方法通过数组优化的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/。。。等 那么代码有什么问题?有没有办法做得更好?有优化吗?在整个字符串中循环需要一些时间,可能只
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,也可以将其删除。除了串行代码中建议的优化之外,我还将使用并行处理来进一步减少时间。如果您有一个非常大的文件,您可以将读取文件和处理读取行的工作分为不同的线程。这样,当一个线程忙于从大文件中读取下一行时,另一个线程可以处理读取的行并在控制台上打印它们。除了串行代码中建议的优化外,我还将进行并行处理以进一步减少时间。如果您有一个非常大的文件,您可以将读取文件和处理读取行的工作分为不同的线程。这样,当一个线程忙于从大文件中读取下一行时,另一个线程可以处理读取的行并在控制台上打印它们。我不知道,为什么花费的时间比预期的要长,我唯一能做的就是