Java有效读取大文件(〜100GB)
作者:互联网
我想用Java有效地读取一个巨大的二进制文件(〜100GB).我必须处理它的每一行.行处理将在单独的线程中进行.我不想将整个文件加载到内存中.分块阅读有效吗?最佳缓冲区大小是多少?有什么公式吗?
解决方法:
如果这是一个二进制文件,则以“行”读取没有太大意义.
如果文件确实是二进制文件,则使用BufferedInputStream并一次将一个字节读取到byte []中.当到达标记“行”结尾的字节时,将byte []和行中的字节数添加到队列中,以供工作线程处理.
重复一遍.
提示:
>使用有限缓冲区,以防读取行比处理行更快.
>回收byte []对象以减少垃圾的产生.
如果文件是(真正的)文本,则可以使用BufferedReader和readLine()方法,而不是调用read().
以上将为您提供合理的性能.根据处理每一行需要完成的工作量,可能没有必要优化文件读取就足够了.您可以通过分析来检查.
如果分析告诉您读取是瓶颈,那么可以考虑将NIO与ByteBuffer或CharBuffer一起使用.它比read()或readLine()更复杂,但可能更快.
Does reading in chunks work?
BufferedReader或BufferedInputStream都在后台秘密读取.
What will be the optimum buffer size?
缓冲区的大小可能并不那么重要.我将其设置为几KB或几十KB.
Any formula for that?
没有最佳缓冲大小的公式.这将取决于您无法量化的变量.
标签:io,file-io,binaryfiles,java 来源: https://codeday.me/bug/20191112/2023741.html