Viv*_*vek 5 java io file-io binaryfiles
我想用Java有效地读取一个巨大的二进制文件(~100GB)。我必须处理它的每一行。行处理将在单独的线程中进行。我不想将整个文件加载到内存中。分块阅读有用吗?最佳缓冲区大小是多少?有什么公式吗?
如果这是一个二进制文件,那么读取“行”没有多大意义。
如果文件确实是二进制文件,则使用 aBufferedInputStream并一次将一个字节读入byte[]. 当到达标记“行”结束的字节时,将byte[]行中的字节数添加到队列中,供工作线程处理。
并重复。
尖端:
byte[]对象以减少垃圾产生。如果文件是(确实)文本,那么您可以使用BufferedReader和 该readLine()方法而不是调用read().
以上将为您提供合理的性能。根据处理每一行需要完成多少工作,优化文件读取可能已经足够了。您可以通过分析来检查这一点。
如果您的分析告诉您阅读是瓶颈,那么请考虑将 NIO 与ByteBuffer或 一起使用CharBuffer。它更复杂,但可能比read()或更快readLine()。
分块阅读有用吗?
BufferedReader 或 BufferedInputStream 都在幕后以块的形式读取。
最佳缓冲区大小是多少?
缓冲区大小可能并不那么重要。我会把它做成几KB或几十KB。
有什么公式吗?
不,没有最佳缓冲区大小的公式。这将取决于您无法量化的变量。
| 归档时间: |
|
| 查看次数: |
14705 次 |
| 最近记录: |