可以从差异线程中读取磁盘优化程序吗?

时间:2016-01-20 17:48:24

标签: java multithreading file

我想知道有没有办法优化java中的磁盘读取。我的意思是例如我想在某些目录中打印所有文本文件的包含,但是在大写之后。我可以创建另一个线程做大写它们,但我可以通过添加另一个(线程)来读取文件来优化读取吗?我的意思是2,3或更多线程从磁盘读取差异文件。这样做有没有优化?我希望我能清楚地解释这个问题。

2 个答案:

答案 0 :(得分:2)

  

我想打印所有文本文件的包含

这很可能是你的瓶颈。如果没有,你应该专注于你的瓶颈,因为优化任何其他可能会使你的代码复杂化而没有任何好处。

  

我可以创建另一个大写它们的线程,

你可以,虽然将工作转移到另一个线程可能比将它设置为大写更昂贵,具体取决于你的工作方式。

  

我可以通过添加另一个(线程)来读取文件来优化读取吗?

可能。你有多少个磁盘。如果你有一个磁盘,通常一次只能做一件事。

  

我的意思是2,3或更多线程从磁盘读取差异文件。

大多数桌面驱动器一次只能执行一项操作。

  

这样做是否有优化?

是的,但正如我所说,直到你知道你的瓶颈是什么,很难跳到解决方案。

答案 1 :(得分:0)

  

我可以创建另一个大写的大写

这实际上是朝着正确的方向前进,但只是简单地将所有字母都设为大写并没有足够的时间来真正重要,除非你正在处理文件的大块。

因为read-then-process的标准单线程模型意味着您可以同时读取数据或处理数据,当您可以同时执行这两种操作时。

例如,您可能会从大型视频流文件中创建一系列高度压缩(例如,JPEG2000,因为它是如此CPU密集型)图像。你可以让一个线程从流中读取帧,将它们放入队列进行处理,然后让N个线程将帧处理成一个图像。

您调整读取数据的线程数和处理数据的线程数,以保持磁盘和CPU最大忙,而不会产生过多的争用。

在某些情况下,您可以使用多个线程从单个文件中读取以获得更好的性能。但是你需要一个从头开始设计的系统来做到这一点。您需要大量磁盘(如果它们是固态硬盘,则需要更少磁盘),相当大的IO基础架构以及具有大量IO带宽的系统,然后您需要一个可以同时处理多个磁盘的文件系统文件。然后,为了通过使用多个线程进行读取而获得更好的性能,您必须编写的代码必须与磁盘上文件的物理布局相匹配。

如果您从分布在多个设备上的文件中进行大量随机读取,那么效果最佳。就像一个大型,高性能的数据库服务器。

例如,假设我有一个巨大的数据文件分布在四个或五个磁盘(甚至RAID阵列)上,文件以64KB块的形式分布在磁盘上。执行64KB读取的少数线程非常适合以随机访问模式读取或写入此类文件。让我们说一切都非常快,你可以从这样的文件读取或写入1 GB /秒。

但是如果你转过身来尝试在流中复制这些数据,你仍然可以使用多个线程来获得最大性能 - 比如1 GB /秒 - 但是如果你只是用一个线程来做{{1}以1 MB的块调用你可能获得950 MB /秒 - 或95%或最大的多线程读取性能。

我实际上对这些系统进行了基准测试,而且大多数情况下,多线程IO并不值得给您带来麻烦,除非您在硬件和软件上投入了大量资金(开源文件系统往往不会要做得非常好 - 你需要进入IBM的GPFS和甲骨文(即LSC'然后是Sun的QFS)领域,你就知道你到底是什么&#39你在设置它时会做的。