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