【问题标题】:Java: What's the most efficient way to read relatively large txt files and store its data?Java:读取相对较大的 txt 文件并存储其数据的最有效方法是什么?
【发布时间】:2014-10-22 18:19:29
【问题描述】:

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

我拿了一些我用来阅读文本文件的现有代码(不知道其他代码):

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(); }

这似乎适用于大约 3000 个字符的小文本文件,但读取包含超过 4500 万个字符的文件需要很长时间(我只是在 10 分钟后取消它)。

有没有更有效的方法?

【问题讨论】:

  • 我不确定,但FileInputStream 可能会更好。
  • 使用StringBuilder而不是String,你需要把它保存在内存中——你不能一读就处理它?如果它是一个大文件,你可以只为文件内容浪费整个内存
  • seq += line; 似乎不对。您应该为其创建 StringBuilderappend 新行。
  • @SamTebbs33 阅读器用于处理文本源,流用于处理二进制源。 FileReader 在这里似乎是正确的课程。

标签: java string memory


【解决方案1】:

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

【讨论】:

  • 非常感谢。我不知道字符串是不可变的。现在使用 StringBuilder 大约需要 3 秒,而不是使用 String 需要 10 分钟以上。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    String content = new Scanner(new File("input")).useDelimiter("\\Z").next();
    

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

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2014-02-01
      • 2016-01-08
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多