我正在开发一个应用程序,它收集了硬盘驱动器的所有文件的列表,之后它也会将文件写入硬盘驱动器。
我想问:执行此任务的并发线程的最佳数量是多少?
我的意思是,我应该有多少个线程来读取硬盘驱动器,而不会使硬盘驱动器变慢,因为有太多的线程正在并发读取它。
谢谢!
发布于 2011-03-16 14:32:17
首先,我会说一个!
这实际上取决于要读取的数据是否需要复杂的计算才能详细说明。在这种情况下,可以方便地实例化多个线程来详细说明不同的磁盘数据;但只有在同一系统上有多个CPU时,这才是方便的。
否则,多个线程会使HDD承受超过必要的压力:来自不同线程的并发读取将发出读取文件块(*)的查找操作,从而引入可能会减慢系统速度的开销,具体取决于读取的文件数量和文件的大小。
按顺序读取文件。
(*)操作系统实际上会尝试按顺序存储相同的文件块,以加快读取操作。磁盘碎片会发生,因此非顺序碎片需要进行查找操作,这实际上需要更多的时间来处理同一位置的读取操作。尝试并行读取多个文件将导致大量寻道,因为单个文件块是连续的,而多个文件块可能不连续。
发布于 2011-03-16 14:50:45
一个线程。如果您同时读取和写入,并且您的目标是与源磁盘不同的磁盘,则需要2个线程。我要补充的是,如果您正在对文件执行其他操作(例如,解压缩),解压缩部分可以在第三个线程上完成。
举几个例子(我忽略了连接,重解析点...)
我的工作假设是磁盘一次可以做一个操作,每次“多任务”在不同的读/写之间切换时,它都会失去速度。机械磁盘有这个问题(但从技术上讲,NCQ可以提供帮助)。固态硬盘我不知道(但我知道如果你一次做两个操作,U盘会很慢)
我搜索过你是怎么做的..。我还没有找到任何“特定”的例子,但是我有一些Windows API的链接,你可以从这里开始:
显示卷路径的
发布于 2011-03-16 14:57:33
从不并发处理IO密集型操作。它更慢,因为磁盘探测器在不同线程/文件之间切换时浪费了大量时间。
如果IO操作中有几个线程,我该怎么办?并发地产生这些操作,并单线程执行它们。我们有一个容器,像ConcurrentQueue<T>(或者你自己写的线程安全队列),有10个线程,将从这些文件中读取1.txt,2.txt ... 10.txt。你同时将“thread request”放入队列,另一个线程处理所有请求(打开1.txt,获取你想要的,然后继续2.txt),在这种情况下,磁盘探测器将不会忙于在线程/文件之间切换。
https://stackoverflow.com/questions/5321768
复制相似问题