我注意到将 24Mb 的数据从一个文件夹复制到另一个文件夹大约需要 30 秒,因为(我猜是这个原因)它有超过 1,000 个独立文件。复制 24Mb 不应该花这么长时间。为什么文件数量会有所不同?
我在 MacBook 上运行 Windows 7(4GB RAM、Intel(R) Core(TM)2 Duo CPU P7450 @ 2.13GHz、32 位操作系统)
编辑:NTFS 是驱动器上使用的文件系统
答案1
HDD 没有确切的传输速率,它取决于适当的维护,即没有碎片,也没有坏扇区等...
如果 HDD 是 SATA 2 并且它是相同的分区,则只是数据传输速度。
如果同一个硬盘中有两个分区,则不需要在总线和主板之间传输数据,即将数据加载到缓冲区中。(取决于硬盘缓冲区大小。)
但是对于每个复制的文件,系统都必须在硬盘的 MFT(主文件表)中保存其索引,如果您复制许多文件,这会使复制过程变慢。如果您有任何防病毒软件,它将扫描复制的每个文件。如果您启用了 Microsoft 搜索文件索引(或任何其他文件索引服务),结果会更糟。
我想导致很多文件复制速度较慢的原因肯定还有很多其他,但是这些应该是主要的。
答案2
为什么文件数量会有差别?
显然,您只关注“复制文件”中的“复制数据”方面。文件不仅仅是数据;它是文件系统。文件具有名称、属性和权限。在“复制文件”时,必须将有关文件的所有这些附加信息与数据一起复制。执行此文件系统开销需要大量的磁盘 I/O。
在通用文件系统中复制一个(1)文件的过程如下:
- 在文件系统中查找源文件。(a)
- 从磁盘读取源文件的目录条目。
- 验证读取权限。
- 在文件系统中查找目标文件。(b)
- 验证目标目录中的写入权限。
- 如果有必要的话,扩展目录以容纳新文件。(c)
- 更新磁盘上的目录。(c1)
- 找到空闲块,分配它们并再次更新表。(d)
- 读取文件数据并复制到目标文件(即复制“文件”)。
- 使用(大小和时间)更新新文件的目录条目。(e)
- 更新源目录条目的访问时间。(f)
(A)这至少意味着搜索当前目录。或者路径可能从文件系统的根目录开始,并且必须遍历几级目录。
(二)这至少意味着搜索当前目录。或者路径可能从文件系统的根目录开始,并且必须遍历几级目录。如果目标文件已经存在,则确定复制应如何继续或中止。如果目标文件不存在,则必须创建一个新的目录条目,这可能涉及扩展目录(即文件块(又称群集)分配开销)。
(C)如果需要扩展目录,则通过查找空闲块来分配新块,调整带有新分配的分配表,然后写将块写入磁盘。由于大多数文件系统都维护分配表的多个副本,因此这意味着多次写入磁盘。
(c1)找到目标目录后,读磁盘中的目录块,调整将其与所复制文件的新目录条目一起,然后写将块写入磁盘。
(四)为了复制文件,通过查找空闲块来分配块,调整包含新分配的分配表,然后写将块写入磁盘。由于大多数文件系统维护分配表的多个副本,因此这意味着多次写入磁盘。为了保持数据完整性,文件系统可能不会尝试合并(延迟和合并)磁盘写目录和分配表的操作,而是在新文件创建和块分配时立即执行写入操作。
(五)数据复制完成后,更新具有适当文件长度和时间戳的复制文件的新目录条目,然后写将目录块写入磁盘。
(F) 更新源目录条目带有新的“访问”时间戳,然后写将目录块写入磁盘。
因此,您的问题不只是复制一个文件,而是复制一千个文件,这样做是否会增加复制文件数据部分所需的时间?如果您只复制一个 24MB 的文件,那么您将可以将其与复制一千个文件所需的时间进行比较。
什么时候备份文件系统,将单个文件复制到磁盘或分区上的另一个文件系统很少使用,因为正如您所发现的那样,这是一个相当缓慢的过程。更快的方法是创建并写入单个档案以特殊文件格式保存源目录条目和文件内容的文件;备份程序和 *nix 命令“tar”可以输出这样的存档文件。(请注意,“tar”仅处理存档文件,而不使用像存档+压缩实用程序那样的压缩。)最快的备份方法是写入块设备(而不是设备上的文件系统),以便忽略源文件系统(将其视为更多数据)并可以执行源设备的逐块映像复制。
答案3
读取 FAT、重新定位磁头、打开文件并更改文件 - 所有这些都需要时间
答案4
这是一个概念上的类比:
(亲爱的互联网,请记住,类比是有缺陷的。请在评论中指出。)
假设:
- 信息传输代理
==
有个孩子,我们叫他萨姆,正在把鸡蛋从一个篮子移到另一个篮子里。 - 信息传递的媒介
==
我想是空气。这里并不重要。 - 这些蛋来自不同的物种,包括……恐龙……以及神话中的水下海兽和龙。 (鸡蛋可能真的很大)
- 文件大小
==
蛋的体积。想想罗宾的蛋和龙的蛋。
比喻:
因此,萨姆必须把鸡蛋从一个篮子移到另一个篮子,因为他在农场工作,给他任务的人都很卑鄙。这个农场里有各种产卵动物,包括龙和神话中的海兽;萨姆认为这很棒,原因有几个。(其实并不重要,但这是我的比喻)
山姆带着他的两个篮子在河边休息,其中一个篮子里有鸡蛋。篮子里的鸡蛋大小不一,从
- 知更鸟蛋占据了
100 bytes
篮子里的大部分空间
到
- 海妖蛋,大小约为
2.7Gb
。
山姆必须开始移动鸡蛋,所以他开始抓起鸡蛋并移动它们。假设他决定先移动一颗龙蛋。现在这颗蛋非常大而且密度很大,所以他花了一段时间才把它拉到另一个篮子里。山姆
把龙蛋放进了另一个篮子里,他很生气。这很难,因为这个东西占据了太多空间;移动它花了很长时间,就为了移动一颗蛋。
萨姆是一个傻瓜。
山姆回到第一个篮子去拿另一个鸡蛋。他意识到他实际上只有一个大鸡蛋。然而,还剩下 100,000,000,000 个罗宾蛋。
正如您所见,Sam 的下午被毁了。他的本能反应是,恐龙蛋应该比他想象的更糟糕,他才不得不搬走。当我们谈论鸡蛋和篮子时,这是有道理的,但计算机处理的数字是 100,000,000,000。
简而言之:
为什么移动几个小文件比移动几个大文件要花费更长的时间,答案与移动它们的操作相关的成本有关。小文件越多,需要执行的操作就越多。另一种看待这个问题的方式是谈论信息密度。