使用多个线程来加速IO may work,但我需要通过单个线程顺序处理一个巨大的文件(或目录树)。但是,我可以想象两种可能的方法来加快文件的读取速度:
主线程从辅助线程提供的PipedInputStream
(或类似)获取所有数据,辅助线程是唯一访问该文件的线程。同步开销较高,但与OS(与底层库通信)的通信较少。这对于单个文件来说很简单,但对于目录树来说非常复杂。
主线程打开new FileInputStream(file)
并将其读取为就像它一个人一样。辅助线程在同一个文件上打开它自己的流并提前读取。主线程不需要等待磁盘,因为它从操作系统缓存中获取所有数据。应该有一些简单的同步,确保辅助线程不会跑得太远。这可以用于目录树,而无需额外的努力。
答案 0 :(得分:1)
我有一个应用程序可以读取多个文件,从中创建xml并将其发送到服务器 在这种情况下,有一个专用的“馈线”(读取文件并将它们放入队列)和一些“发送者”(创建xml并将其发送到服务器)帮助。
如果您正在进行中等到密集的CPU消耗工作(如XML解析),那么拥有2个线程(1个读取和1个进程)甚至可能对单个核心机器有所帮助。我不会太担心同步开销。当争用很少时,在等待IO时通过工作获得的收益会大得多。如果你的线程等待IO时间,那么将会有更多的好处。
我建议您阅读this chapter from JCiP。它涉及这个主题。
答案 1 :(得分:0)
这取决于! ...关于您的访问模式,在您的硬件上......
“使用多个线程加速IO可能有效” - IF 您的IO子系统(例如大型磁盘阵列)能够同时处理多个IO请求。
在单个桌面驱动器上,您的收益将受到限制;如果您有多个线程执行很大程度上独立的工作(即几乎没有同步点),您可以从一个线程读取数据中受益,而其他线程则处理先前读取的数据。