3

从 CD/DVD 读取数据有一点问题。从本地 HDD 读取时,我的程序(使用 task.factory/threading)似乎可以正常运行。它基本上旨在枚举一堆图像文件以读取有关这些文件的信息并将其写入文本文件。显然,从 CD 读取将比大多数 HDD 等慢得多,但相比之下它的速度非常慢(慢了 20 倍以上)。

我想知道这是否与线程程序试图读取磁盘驱动器上的数据的方式有关和/或我能做些什么呢?此外,如果这在某种程度上是一个线索,它似乎并不像从磁盘读取那么慢(但仍然比从磁盘读取慢得多)。是否可以摆弄磁盘的读取方式或读取速度,或者......我什至不知道。我认为不需要我的程序的任何更多细节,但请询问我是否可以提供任何其他信息。

4

2 回答 2

4

磁盘 IO 的并行性不是很好(可能在 SSD 上除外)——尤其是在具有低带宽(与 HDD 相比 - 与 SSD 相比很小)和相当长的寻道时间的光驱上更是如此。如果您一次开始使用多个线程进行搜索...是的,那将非常慢。

尽量避免有多个线程访问磁盘。您可以做的是让一个线程读取数据,然后将工作推送到工作队列中 - 然后等待尽可能多的工作人员从队列中获取工作并处理它。这将最大限度地减少 IO 争用,同时仍然允许并行处理实际工作。

于 2013-10-21T18:57:31.430 回答
4

光驱是 CLV 驱动器,Contant Linear Velocity。这使得他们非常擅长在磁盘上打包大量数据。但这有一个巨大的缺点,将读取头移动到另一个轨道非常慢。它还需要改变磁盘的旋转速度。播放电影时不是问题,当您需要随机访问时是大问题。

像这样具有非常慢的寻道时间的磁盘驱动器的第一条规则:如果可以避免的话 ,永远不要让读取器磁头移动。

它调用了第二条规则:永远不要使用多个线程从这样的驱动器中读取。因为每个线程都会将读取器头发送到它正在读取的轨道。来回,搜索使其非常缓慢。

与普通硬盘一样,使用多个线程是没有意义的,它们只是轮流让驱动器满足他们的请求。线程只能在多核处理器上为您购买更多的 CPU 周期。所以只能使用一个线程来阅读。

于 2013-10-21T18:59:32.850 回答