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