Java多线程读取单个大文件

标签 java concurrency io

对于 Java 多线程应用程序,许多线程必须读取完全相同的文件(大小 > 1GB)并将其公开为输入流的有效方法是什么?我注意到如果有很多线程(> 32),系统就会开始争用 I/O 并且有很多 I/O 等待。

我考虑过将文件加载到一个由所有线程共享的字节数组中——每个线程都会创建一个 ByteArrayInputStream,但分配一个 1GB 的字节数组效果不佳。

我还考虑过使用单个 FileChannel,每个线程使用 Channels.newInputStream() 在其上创建一个 InputStream,但似乎是 FileChannel 维护了 InputStream 的状态。

最佳答案

在我看来,如果您想避免 IO 争用,您将将文件加载到内存中。操作系统会做一些缓冲,但如果您发现这还不够,您将不得不自己做。

你真的需要 32 个线程吗?大概你没有那么多内核 - 所以使用更少的线程,你会得到更少的上下文切换等。

您的线程是否从头到尾都在处理文件?如果是这样,您能否有效地将文件分成 block ?将第一个(比如说)10MB 的数据读入内存,让所有线程处理它,然后继续处理下一个 10MB 等等。

如果这对您不起作用,与文件大小相比,您有多少内存?如果您有足够的内存但又不想分配一个巨大的数组,则可以将整个文件读入内存,但读入许多单独的较小字节数组。然后您必须编写一个跨越所有这些字节数组的输入流,但这应该是可行的。

关于Java多线程读取单个大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547209/

相关文章:

java - MalfomedURLException 未找到协议(protocol)

Java字符串解析器查找字符串,保存并打印它

java - try-with-resource - Java 8 上的 finally 关键字错误

java - 如果weakCompareAndSet 的实现与compareAndSet 完全一样,它怎么会虚假失败?

python - 通过多个 Tor 代理的并发 HTTP 请求

java - java中文件路径的Windows转义序列问题

java - 如何在上传并保存在文件夹中时使用java更改图像名称?

concurrency - x86 CMPXCHG是原子的,如果需要,为什么它需要LOCK?

java - 设计 ByteArrayOutputStream 公共(public)接口(interface)的理由?

linux - write() 到文件什么时候返回 EWOULDBLOCK?