我运行了以下测试,并使用此批处理创建了一个包含 15'000 个 400 字节文件的文件夹:
@ECHO off
SET times=15000
FOR /L %%i IN (1,1,%times%) DO (
fsutil file createnew filename%%i.txt 400
)
然后我使用以下命令将其复制到我的 Windows 计算机上:
robocopy LargeNumberOfFiles\ LargeNumberOfFiles2\
完成后,我可以看到传输速率为 915810 字节/秒,小于 1 MB/秒。我花了几秒钟才复制 7 MB。请注意,这非常慢。
我已经尝试对一个包含 50 MB 单个文件的文件夹进行相同操作,传输速率为 1219512195 字节/秒(是的,GB/s),即时。
为什么在 Windows 文件系统上复制大量文件会耗费如此多的时间资源?
请注意,我已尝试在同一台计算机上的虚拟机(vmware player)上运行的具有 ext3 文件系统的 Linux 系统上执行相同操作。
我使用 cp 命令,复制是瞬间完成的!
另请注意以下事项:
- 没有防病毒软件
- 我已经在多台 Windows 计算机(始终为 ntfs)上测试了该行为,我总是得到可比的结果(传输速率低于 1MB/s,平均需要 7-8 秒才能复制 7 MBytes)
- 我已经在多个 Linux ext3 系统上测试过,对于该数量(15000 个 400 字节的文件)的复制总是即时的
- 问题是为了了解是什么使得 Windows 文件系统与 Linux 文件系统相比复制大量文件的速度如此之慢。
答案1
您的 15,000 个文件需要至少 60,000 次高清交易才能完成:
- 阅读源文件
- 分配新的目标文件描述符
- 写入目标文件
- 更新目标文件描述符
您可能也在使用不支持命令队列的 SATA 驱动器(只是猜测),这意味着驱动器必须单独处理所有 60,000 个操作。高端 SCSI 驱动器和阵列可以通过在执行之前将多个操作排队到类似位置来提高性能。
您的单个文件复制至少需要 4 次操作(但可能更多,视情况而定);与之前相同。如果读取或写入操作中有文件碎片,则可能超过 4 次。
吞吐量不仅以每秒字节数来衡量,还以每秒 IOps(本质上是每秒操作数)来衡量。您受到后者的限制。
答案2
最可能的原因是您的 Windows 系统在复制和粘贴时创建缩略图预览。使用 CLI 工具,例如机器人复制, 反而。