Java:What';读取相对较大的txt文件并存储其数据的最有效方法是什么?

Java:What';读取相对较大的txt文件并存储其数据的最有效方法是什么?,java,string,memory,Java,String,Memory,我应该写一个读取DNA序列的方法,以便在上面测试一些字符串匹配算法 我使用了一些用于读取文本文件的现有代码(不知道其他代码): 这对于大约3000个字符的小文本文件来说似乎效果很好,但要读取超过4500万个字符的文件(我只是在10分钟后取消了它)需要很长时间 有更有效的方法吗?我注意到的一件事是,您正在执行seq+=line。seq可能是一个字符串?如果是这样,那么您必须记住字符串是不可变的。所以事实上,每次尝试向字符串追加一行时,您所做的就是创建一个新字符串。请改用。另外,如果可能的话,您不想

我应该写一个读取DNA序列的方法,以便在上面测试一些字符串匹配算法

我使用了一些用于读取文本文件的现有代码(不知道其他代码):

这对于大约3000个字符的小文本文件来说似乎效果很好,但要读取超过4500万个字符的文件(我只是在10分钟后取消了它)需要很长时间


有更有效的方法吗?

我注意到的一件事是,您正在执行seq+=line。seq可能是一个字符串?如果是这样,那么您必须记住字符串是不可变的。所以事实上,每次尝试向字符串追加一行时,您所做的就是创建一个新字符串。请改用。另外,如果可能的话,您不想创建一个字符串然后处理。那样你就得做两次。理想情况下,您希望在阅读时进行处理,但我不知道您的情况。

我注意到的一件事是您正在执行seq+=line。seq可能是一个字符串?如果是这样,那么您必须记住字符串是不可变的。所以事实上,每次尝试向字符串追加一行时,您所做的就是创建一个新字符串。请改用。另外,如果可能的话,您不想创建一个字符串然后处理。那样你就得做两次。理想情况下,您希望在阅读时进行处理,但我不知道您的情况。

在调用seq+=line时,减慢进度的主要因素是字符串seq和line的“串联”。我使用引号进行连接,因为在Java中,字符串一旦创建就不能修改(例如,前面提到的user1598503是不可变的)。起初,这不是一个问题,因为字符串很小,但是一旦字符串变得很长,例如数十万个字符,就必须为新字符串重新分配内存,这需要相当长的时间。StringBuilder将允许您在适当的位置执行这些连接,这意味着您不会每次都创建一个新对象。

在调用seq+=line时,减慢进度的主要因素是字符串seq和line的“连接”。我使用引号进行连接,因为在Java中,字符串一旦创建就不能修改(例如,前面提到的user1598503是不可变的)。起初,这不是一个问题,因为字符串很小,但是一旦字符串变得很长,例如数十万个字符,就必须为新字符串重新分配内存,这需要相当长的时间。StringBuilder将允许您在适当的位置执行这些连接,这意味着您不会每次都创建一个新对象。

您的问题不是读取需要太多时间,而是连接需要太多时间。为了验证这一点,我运行了您的代码(没有完成),然后简单地返回第8行(seq+=行),它在不到一秒钟的时间内运行。您可以尝试使用seq=seq.concat(line),因为据报道它在大多数情况下都要快一点,但我也尝试过,并且没有在1-2分钟内运行(对于9.6mb的输入文件)。我的解决方案是将行存储在ArrayList(或您选择的容器)中。ArrayList示例使用相同的输入文件大约需要2-3秒。(因此while循环的内容是list.add(line);)。如果您真的想将整个文件存储在字符串中,您可以执行以下操作(使用Scanner类):


^^这也可以在几秒钟内完成。我应该提到“\Z”是文件结尾分隔符,所以它一下子就能读取整个文件。

您的问题不是读取需要太多时间,而是连接需要太多时间。为了验证这一点,我运行了您的代码(没有完成),然后简单地返回第8行(seq+=行),它在不到一秒钟的时间内运行。您可以尝试使用seq=seq.concat(line),因为据报道它在大多数情况下都要快一点,但我也尝试过,并且没有在1-2分钟内运行(对于9.6mb的输入文件)。我的解决方案是将行存储在ArrayList(或您选择的容器)中。ArrayList示例使用相同的输入文件大约需要2-3秒。(因此while循环的内容是list.add(line);)。如果您真的想将整个文件存储在字符串中,您可以执行以下操作(使用Scanner类):


^^这也可以在几秒钟内完成。我应该提到“\Z”是文件的结尾分隔符,所以这就是为什么它可以一下子读取整个文件。

我不确定,但是
FileInputStream
可能更好。使用StringBuilder而不是字符串,并且需要将其保存在内存中—您不能在读取后立即处理它?如果它是一个大文件,您可能只会为文件内容
seq+=行浪费整个内存似乎不正确。您应该创建
StringBuilder
append
新行。@SamTebbs33读卡器用于处理文本源,流用于处理二进制源
FileReader
在这里似乎是正确的类。我不确定,但是
FileInputStream
可能更好。使用StringBuilder而不是字符串,您需要将其保存在内存中--您不能在读取它后立即处理它吗?如果它是一个大文件,您可能只会为文件内容
seq+=行浪费整个内存似乎不正确。您应该创建
StringBuilder
append
新行。@SamTebbs33读卡器用于处理文本源,流用于处理二进制源<代码>文件阅读器
在这里似乎是正确的类。非常感谢。我不知道字符串是不可变的。现在使用StringBuilder大约需要3秒钟,而不是使用String只需要10分钟。非常感谢。我不知道字符串是不可变的。现在使用StringBuilder大约需要3秒钟,而不是使用String只需10分钟。
try {
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);

    while((line = br.readLine()) != null) {
        seq += line;
    }

    br.close();
}
catch(FileNotFoundException e) { e.printStackTrace(); }
catch(IOException e) { e.printStackTrace(); }
String content = new Scanner(new File("input")).useDelimiter("\\Z").next();