使用Thread从文件中预取是否有用?

时间:2011-03-08 03:54:24

标签: java multithreading io

使用多个线程来加速IO may work,但我需要通过单个线程顺序处理一个巨大的文件(或目录树)。但是,我可以想象两种可能的方法来加快文件的读取速度:

馈线

主线程从辅助线程提供的PipedInputStream(或类似)获取所有数据,辅助线程是唯一访问该文件的线程。同步开销较高,但与OS(与底层库通信)的通信较少。这对于单个文件来说很简单,但对于目录树来说非常复杂。

预取

主线程打开new FileInputStream(file)并将其读取为就像它一个人一样。辅助线程在同一个文件上打开它自己的流并提前读取。主线程不需要等待磁盘,因为它从操作系统缓存中获取所有数据。应该有一些简单的同步,确保辅助线程不会跑得太远。这可以用于目录树,而无需额外的努力。

问题

  • 你会推荐尝试哪种想法(如果有的话)?
  • 你用过这样的东西吗?
  • 还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

我有一个应用程序可以读取多个文件,从中创建xml并将其发送到服务器 在这种情况下,有一个专用的“馈线”(读取文件并将它们放入队列)和一些“发送者”(创建xml并将其发送到服务器)帮助。

如果您正在进行中等到密集的CPU消耗工作(如XML解析),那么拥有2个线程(1个读取和1个进程)甚至可能对单个核心机器有所帮助。我不会太担心同步开销。当争用很少时,在等待IO时通过工作获得的收益会大得多。如果你的线程等待IO时间,那么将会有更多的好处。

我建议您阅读this chapter from JCiP。它涉及这个主题。

答案 1 :(得分:0)

这取决于! ...关于您的访问模式,在您的硬件上......

“使用多个线程加速IO可能有效” - IF 您的IO子系统(例如大型磁盘阵列)能够同时处理多个IO请求。

在单个桌面驱动器上,您的收益将受到限制;如果您有多个线程执行很大程度上独立的工作(即几乎没有同步点),您可以从一个线程读取数据中受益,而其他线程则处理先前读取的数据。