0

我有一个程序可以将大量文件从多个目录复制到一个目录。数量未知(大约 50K),但它们都在同一个驱动器上。在程序中应该有一个进度条。当我第一次编写程序时,我没有编写进度条并且程序运行缓慢。我花了大约 15-20 分钟来传递文件。为了编写进度条,我需要知道我有多少文件,所以我浏览了目录并列出了文件。现在第一次运行文件大约需要 5 分钟,但复制只需要 5-7 分钟。

谁能解释这种现象?很抱歉我不能分享代码,但它是一个简单的使用File.Copy和简单的 c# .net 3.5progressBar

4

2 回答 2

4

这种方法最大限度地减少了磁盘驱动器上最昂贵的操作,即移动读取器磁头。磁盘速度由两个基本的机械约束来评定。一个是盘片旋转的速度,它设定了数据传输速度的上限。那是固定的。以及读取头可以多快移动到另一个轨道。寻道时间,通常需要十多毫秒才能将其移动一个轨道。cpu 周期很长。这使得访问磁盘数据的顺序非常重要。像你原来那样在目录记录和文件数据集群之间不断地来回切换读者的头是非常昂贵的。

磁盘上的数据碎片程度也很重要,这就是碎片整理实用程序存在的原因。看到创建和删除文件的比率很高的驱动器往往会更快地碎片化。碎片率越高,从驱动器读取数据所需的磁盘寻道次数就越多。

通过首先阅读目录条目,您可以避免大量搜索。它们位于驱动器的一个称为 MFT 的区域中,物理上彼此靠近,因此长寻道次数要少得多。当您真正开始复制文件时,您会再次阅读它们,但这次它们来自文件系统缓存。第一次扫描目录时存储在 RAM 中。因此,无需对 MFT 进行昂贵的搜索。

同样值得注意的是,SSD 比机械驱动器工作得更好的原因是,它们的寻道时间非常短。

于 2013-07-10T11:36:23.967 回答
0

这不是现象,是缓存

于 2013-07-10T08:54:38.277 回答