首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有多少个线程用于读写硬盘?

有多少个线程用于读写硬盘?
EN

Stack Overflow用户
提问于 2011-03-16 14:24:51
回答 7查看 7.8K关注 0票数 11

我正在开发一个应用程序,它收集了硬盘驱动器的所有文件的列表,之后它也会将文件写入硬盘驱动器。

我想问:执行此任务的并发线程的最佳数量是多少?

我的意思是,我应该有多少个线程来读取硬盘驱动器,而不会使硬盘驱动器变慢,因为有太多的线程正在并发读取它。

谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-16 14:32:17

首先,我会说一个!

这实际上取决于要读取的数据是否需要复杂的计算才能详细说明。在这种情况下,可以方便地实例化多个线程来详细说明不同的磁盘数据;但只有在同一系统上有多个CPU时,这才是方便的。

否则,多个线程会使HDD承受超过必要的压力:来自不同线程的并发读取将发出读取文件块(*)的查找操作,从而引入可能会减慢系统速度的开销,具体取决于读取的文件数量和文件的大小。

按顺序读取文件。

(*)操作系统实际上会尝试按顺序存储相同的文件块,以加快读取操作。磁盘碎片会发生,因此非顺序碎片需要进行查找操作,这实际上需要更多的时间来处理同一位置的读取操作。尝试并行读取多个文件将导致大量寻道,因为单个文件块是连续的,而多个文件块可能不连续。

票数 6
EN

Stack Overflow用户

发布于 2011-03-16 14:50:45

一个线程。如果您同时读取和写入,并且您的目标是与源磁盘不同的磁盘,则需要2个线程。我要补充的是,如果您正在对文件执行其他操作(例如,解压缩),解压缩部分可以在第三个线程上完成。

举几个例子(我忽略了连接,重解析点...)

  • C: to C: 1线程总数
  • C: to D:相同物理磁盘,不同分区:1线程总数
  • C: to D:不同物理磁盘:2线程总数

我的工作假设是磁盘一次可以做一个操作,每次“多任务”在不同的读/写之间切换时,它都会失去速度。机械磁盘有这个问题(但从技术上讲,NCQ可以提供帮助)。固态硬盘我不知道(但我知道如果你一次做两个操作,U盘会很慢)

我搜索过你是怎么做的..。我还没有找到任何“特定”的例子,但是我有一些Windows API的链接,你可以从这里开始:

显示卷路径的

  • http://msdn.microsoft.com/en-us/library/cc542456%28VS.85%29.aspx
  • GetVolumePathName:http://msdn.microsoft.com/en-us/library/aa364996(v=VS.85).aspx
  • GetVolumeInformationByHandleW http://msdn.microsoft.com/en-us/library/aa964920(v=VS.85).aspx
票数 3
EN

Stack Overflow用户

发布于 2011-03-16 14:57:33

从不并发处理IO密集型操作。它更慢,因为磁盘探测器在不同线程/文件之间切换时浪费了大量时间。

如果IO操作中有几个线程,我该怎么办?并发地产生这些操作,并单线程执行它们。我们有一个容器,像ConcurrentQueue<T>(或者你自己写的线程安全队列),有10个线程,将从这些文件中读取1.txt,2.txt ... 10.txt。你同时将“thread request”放入队列,另一个线程处理所有请求(打开1.txt,获取你想要的,然后继续2.txt),在这种情况下,磁盘探测器将不会忙于在线程/文件之间切换。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5321768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档