Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用线程从文件预取有用吗?_Java_Multithreading_Io - Fatal编程技术网

Java 使用线程从文件预取有用吗?

Java 使用线程从文件预取有用吗?,java,multithreading,io,Java,Multithreading,Io,使用多个线程来加速IO,但我需要通过单个线程顺序处理一个巨大的文件(或目录树)。但是,我可以想象两种可能的方法来加速文件读取: 饲养员 主线程从辅助线程提供的PipedInputStream(或类似)获取所有数据,辅助线程是唯一访问文件的线程。同步开销更高,但与操作系统(与之通信的底层库)的通信更少。这对于单个文件来说很简单,但对于目录树来说非常复杂 预取器 主线程打开newfileinputstream(file),并像单独读取一样读取它。辅助线程在同一个文件上打开自己的流并进行读取。主线程不

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

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

预取器 主线程打开
newfileinputstream(file)
,并像单独读取一样读取它。辅助线程在同一个文件上打开自己的流并进行读取。主线程不需要等待磁盘,因为它从操作系统缓存获取所有数据。应该有一些琐碎的同步,以确保辅助线程不会运行得太快。这可以在目录树上工作,而无需额外的努力

问题
  • 您建议尝试哪种想法(如果有的话)
  • 你用过这样的东西吗
  • 还有别的想法吗

视情况而定。。。在您的访问模式上,在您的硬件上

如果您的IO子系统(如大型磁盘阵列)能够同时处理多个IO请求,则“使用多线程加速IO可能会起作用”


在单个桌面驱动器上,您的收益将是有限的;如果您有多个线程执行基本上独立的工作(即,同步点很少),您可以从一个线程读取数据中获益,而其他线程则处理以前读取的数据。

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

如果您正在进行中等强度到高强度的CPU消耗工作(如XML解析),那么即使在单核心机器上,拥有2个线程(1个读取和1个进程)也可能有所帮助。我不会太担心同步开销。在几乎没有争用的情况下,等待IO时做功的收益会大得多。如果您的线程不时地等待IO,那么将会有更多的好处


我建议你读书。它解决了这个问题。

这两个线程做什么?他们是否需要交换数据或以其他方式相互合作?不,所有实际工作都必须由主线程完成,辅助线程只应加快IO速度。除上述内容外,不应有其他合作。