【问题标题】:can reading from disk from difference threads optimize program?可以从不同线程读取磁盘优化程序吗?
【发布时间】:2016-04-26 17:05:27
【问题描述】:

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

【问题讨论】:

  • 您为什么不实施、尝试并写博客,以便我们也可以从您的发现中学习?

标签: java multithreading file


【解决方案1】:

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

这很可能是您的瓶颈。如果没有,你应该关注你的瓶颈是什么,因为优化其他任何东西都可能使你的代码复杂化而没有任何好处。

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

您可以,但将工作传递给另一个线程可能比将其变为大写更昂贵,具体取决于您如何执行此操作。

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

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

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

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

这样做是否有一些优化?

是的,但正如我所说,在您知道自己的瓶颈是什么之前,很难找到解决方案。

【讨论】:

  • 非常感谢。这是我最需要的东西Most desktop drives can only do one operation at a time.。其他条件只是例如 - 我不想在控制台上打印一些东西。我只有一个驱动器。我忘了提这个。我只是不知道硬盘的硬件限制。
  • @DPM 服务器/企业级驱动器可以受益于一次给它多个请求,尽管它不会使磁盘旋转得更快。
【解决方案2】:

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

这实际上是朝着正确的方向发展,但只是将所有字母都大写并不需要足够的时间来真正重要,除非您正在处理非常大的文件块。

因为 read-then-process 的标准单线程模型意味着您要么正在读取数据,要么正在处理数据,而您可以同时进行这两项操作。

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

您需要调整读取数据的线程数和处理数据的线程数,以使您的磁盘和 CPU 都尽可能地忙碌,而不会出现过多的争用。

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

如果您要对分布在多个设备上的文件进行大量随机读取,这种方法效果最好。就像一个大型、高性能的数据库服务器。

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

但是,如果您转身尝试将这些数据复制到流中,您仍然可以使用多个线程来获得最大性能 - 例如 1 GB/秒 - 但如果您只是使用单个线程来执行 read() 调用在 1 MB 块中,您可能会获得 950 MB/秒 - 或 95% 或最大的多线程读取性能。

我实际上已经对此类系统进行了基准测试,而且大多数时候,多线程 IO 不值得麻烦,除非您在硬件和软件上投入了大量资金(开源文件系统往往不能很好地做到这一点 -您需要进入 IBM 的 GPFS 和 Oracle(先是 LSC,然后是 Sun 的)QFS 的领域,并且在设置它时确切地知道自己在做什么。

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2018-01-14
    • 2017-03-16
    相关资源
    最近更新 更多