将BufferedReader流保持打开是否有任何性能优势?

问题描述 投票:0回答:2

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

考虑以下先决条件:

  • 只需要读取一个文件
  • 有问题的文件是包含数据行的文本文件
  • 此文件非常大:50MB或更多
  • 在测试运行期间,该文件被多次读取

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

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

但是,由于文件大小和文件读取的次数,我不知道是否打开流是有益的。如果我是诚实的,我不知道文件大小是否会影响流的开放。

那么总结一下,鉴于上面列出的前提条件,是否会打开一个BufferedReader输入流来提高整体性能?内存泄漏仍然可能吗?

java bufferedreader
2个回答
0
投票

如果你有足够的记忆来做到这一点,那么你可能会通过将整个文件读入StringBuilder,将其变成String,然后通过String重复读取StringReader来获得最佳性能。

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

  • 2 x允许byte - > char扩展
  • 3 x因为StringBuilder缓冲区随着它的增长而扩展的方式。

你可以通过将文件保存在内存中来保存空间,如字节(不是字符),并通过读入恰当大小的byte[]。但是,每次从byte[]读取时,您需要重复字节 - >字符解码。

如果您需要最终性能,您应该对备选方案进

看看使用Buffer来减少复制。


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


0
投票

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

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

我建议其他人在评论和答案中只是将文件读入内存并使用它。一个50MB的文件并没有那么多,加上内存中一次性能的读取将远远高于重新读取文件。

© www.soinside.com 2019 - 2024. All rights reserved.