Java可以高效地读取大文件(~100GB)

Java可以高效地读取大文件(~100GB),java,file-io,io,binaryfiles,Java,File Io,Io,Binaryfiles,我想用Java高效地读取一个巨大的二进制文件(~100GB)。我必须处理每一行。行处理将在单独的线程中进行。我不想将整个文件加载到内存中。分块阅读有效吗?最佳缓冲区大小是多少?有什么公式吗?如果这是一个二进制文件,那么读取“行”就没有多大意义 如果文件是真正的二进制文件,则使用BufferedInputStream,一次读取一个字节到byte[]。当到达标记“行”结尾的字节时,将byte[]和行中的字节数添加到队列中,供工作线程处理 然后重复 小贴士: 使用有界缓冲区,以防读取行的速度快于处理

我想用Java高效地读取一个巨大的二进制文件(~100GB)。我必须处理每一行。行处理将在单独的线程中进行。我不想将整个文件加载到内存中。分块阅读有效吗?最佳缓冲区大小是多少?有什么公式吗?

如果这是一个二进制文件,那么读取“行”就没有多大意义

如果文件是真正的二进制文件,则使用
BufferedInputStream
,一次读取一个字节到
byte[]
。当到达标记“行”结尾的字节时,将
byte[]
和行中的字节数添加到队列中,供工作线程处理

然后重复

小贴士:

  • 使用有界缓冲区,以防读取行的速度快于处理行的速度
  • 回收
    字节[]
    对象以减少垃圾生成
如果文件(实际上)是文本,则可以使用
BufferedReader
readLine()
方法,而不是调用
read()


以上将为您提供合理的性能。根据处理每一行需要做多少工作,优化文件读取可能已经足够了。您可以通过分析来检查这一点

如果你的分析告诉你阅读是瓶颈,那么考虑使用NIO和<代码> ByteBuffer < /代码>或<代码> CharBuffer < /代码>。它比

read()
readLine()
更复杂,但可能更快


分块阅读有效吗

BufferedReader或BufferedInputStream都在封面下以块的形式读取

最佳缓冲区大小是多少

缓冲区的大小可能并不重要。我会把它改成几KB或几十KB

有什么公式吗

不,没有最佳缓冲区大小的公式。它将取决于您无法量化的变量。

Java8,流媒体

Stream<String> lines = Files.lines(Paths.get("c:\myfile.txt"));
lines.forEach(l -> {
  // Do anything line by line   
});
streamlines=Files.lines(path.get(“c:\myfile.txt”);
行。forEach(l->{
//逐行做任何事
});

这可能是您想要做的事情,二进制文件中的一行是什么?BufferedReader的可能重复项=new BufferedReader(new InputStreamReader(new FileInputStream(“file_to_read”),“UTF8”);int行=0;while(reader.readLine()!=null){lines++;}reader.close();抱歉,无法使此代码看起来很好,但它可以工作。我不想将整个文件加载到内存中。别担心,你不会的;)您将受到存储读取速率的限制,希望您使用的是SSD。该文件是一个包含IBM编码数据的大型机文件。此文件转换为二进制格式,这意味着数据包含某些符号,如¥€等。它作为txt文件存储在windows文件夹中。所以可以说它是文本。很抱歉造成混淆。我认为这不是读取大文件的有效方法,因为foreach没有初始化。