代码之家  ›  专栏  ›  技术社区  ›  Rusty Shackleford

让BufferedReader流保持打开状态是否有任何性能好处?

  •  0
  • Rusty Shackleford  · 技术社区  · 7 年前

    在我提出问题之前,我完全知道打开输入流会导致内存泄漏,因此这样做是不好的做法。

    考虑以下先决条件:

    • 只需要读取一个文件
    • 所讨论的文件是一个包含数据行的文本文件
    • 此文件相当大:50MB或更大
    • 在测试运行期间,会多次读取该文件

    我这样问的原因是,在我的测试自动化套件中,需要反复调用相同的文件来验证某些数据字段。

    在当前状态下,数据读取器函数打开 BufferedReader 流,读取/返回数据,然后关闭流。

    然而,由于文件的大小和文件的读取次数,我不知道让流保持打开是否有益。老实说,我不知道文件大小是否会影响流的打开。

    综上所述,考虑到上述先决条件,将 缓冲区读取 输入流提高了整体性能?还有内存泄漏的可能性吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Stephen C    7 年前

    如果您有足够的内存来执行此操作,那么通过将整个文件读入 StringBuilder ,将其转换为 String ,然后重复读取 一串 通过a StringReader .

    但是,您可能需要的(可用)堆空间字节数是文件大小的6倍或更多。

    • 2 x允许 byte -&燃气轮机; char 膨胀
    • 3 x,因为 字符串拼接 缓冲区随着其增长而扩展。

    您可以通过将文件以字节(而不是字符)的形式保存在内存中,并通过读取 byte[] 大小正好合适。但是您需要重复字节->每次读取 字节[] .

    如果您需要最终性能,您应该对备选方案进行基准测试。

    看看使用 Buffer 减少复制。


    这是你的主意。保留 BufferedReader 打开并使用 mark reset 与关闭和重新打开相比,会给您一个小的加速。但文件越大,相对而言,加速比越小。对于一个50GB的文件,我怀疑加速是微不足道的。

        2
  •  0
  •   Ray    7 年前

    是的,不关闭流理论上可以提高性能,因为对象不会触发垃圾收集 假设您没有取消引用BufferedReader。此外,不存在的资源不需要同步。请参阅类似的答案: Performance hit opening and closing filehandler?

    但是,不关闭BufferedReader将导致 memory leak and you'll see heap increase .

    我建议,就像其他人在评论和回答中一样,把文件读入内存并使用它。一个50MB的文件没有那么多,再加上在内存中读取字符串一次的性能,将比重新读取文件高得多。