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

Viv*_*vek 5 java io file-io binaryfiles

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

Ste*_*n C 4

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

如果文件确实是二进制文件,则使用 aBufferedInputStream并一次将一个字节读入byte[]. 当到达标记“行”结束的字节时,将byte[]行中的字节数添加到队列中,供工作线程处理。

并重复。

尖端:

  • 如果您读取行的速度比处理行的速度快,请使用有界缓冲区。
  • 回收byte[]对象以减少垃圾产生。

如果文件是(确实)文本,那么您可以使用BufferedReader和 该readLine()方法而不是调用read().


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

如果您的分析告诉您阅读是瓶颈,那么请考虑将 NIO 与ByteBuffer或 一起使用CharBuffer。它更复杂,但可能比read()或更快readLine()


分块阅读有用吗?

BufferedReader 或 BufferedInputStream 都在幕后以块的形式读取。

最佳缓冲区大小是多少?

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

有什么公式吗?

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