Java 使用线程从文件预取有用吗?
使用多个线程来加速IO,但我需要通过单个线程顺序处理一个巨大的文件(或目录树)。但是,我可以想象两种可能的方法来加速文件读取: 饲养员 主线程从辅助线程提供的Java 使用线程从文件预取有用吗?,java,multithreading,io,Java,Multithreading,Io,使用多个线程来加速IO,但我需要通过单个线程顺序处理一个巨大的文件(或目录树)。但是,我可以想象两种可能的方法来加速文件读取: 饲养员 主线程从辅助线程提供的PipedInputStream(或类似)获取所有数据,辅助线程是唯一访问文件的线程。同步开销更高,但与操作系统(与之通信的底层库)的通信更少。这对于单个文件来说很简单,但对于目录树来说非常复杂 预取器 主线程打开newfileinputstream(file),并像单独读取一样读取它。辅助线程在同一个文件上打开自己的流并进行读取。主线程不
PipedInputStream
(或类似)获取所有数据,辅助线程是唯一访问文件的线程。同步开销更高,但与操作系统(与之通信的底层库)的通信更少。这对于单个文件来说很简单,但对于目录树来说非常复杂
预取器
主线程打开newfileinputstream(file)
,并像单独读取一样读取它。辅助线程在同一个文件上打开自己的流并进行读取。主线程不需要等待磁盘,因为它从操作系统缓存获取所有数据。应该有一些琐碎的同步,以确保辅助线程不会运行得太快。这可以在目录树上工作,而无需额外的努力
问题
- 您建议尝试哪种想法(如果有的话)
- 你用过这样的东西吗
- 还有别的想法吗
在单个桌面驱动器上,您的收益将是有限的;如果您有多个线程执行基本上独立的工作(即,同步点很少),您可以从一个线程读取数据中获益,而其他线程则处理以前读取的数据。我有一个应用程序可以读取多个文件,从中创建xml并将其发送到服务器。
在这种情况下,有一个专用的“feeder”(读取文件并将其放入队列)和几个“sender”(创建xml并将其发送到服务器)会有所帮助 如果您正在进行中等强度到高强度的CPU消耗工作(如XML解析),那么即使在单核心机器上,拥有2个线程(1个读取和1个进程)也可能有所帮助。我不会太担心同步开销。在几乎没有争用的情况下,等待IO时做功的收益会大得多。如果您的线程不时地等待IO,那么将会有更多的好处
我建议你读书。它解决了这个问题。这两个线程做什么?他们是否需要交换数据或以其他方式相互合作?不,所有实际工作都必须由主线程完成,辅助线程只应加快IO速度。除上述内容外,不应有其他合作。