跳转至

复制大量小文件技巧

最近在将旧电脑上存储在HDD分区中的QQ聊天记录,通过一个移动HDD移动硬盘,迁移到新的电脑的SSD分区中。这些聊天记录是累积6年所得,大小约40GB。但更为致命的是,其中有大量小文件,主要是聊天记录中的图片,总共统计下来有22w的文件数量。这些细碎的文件导致我在复制时出现了极大的问题。

我肯定是不可能使用Windows自带的复制功能来完成这项任务的,因为Windows自带的复制功能对于这种零碎文件很鸡肋。所以我采用的是FastCopy,这是61在很多年前推荐给我的方案,我用起来也一直很顺畅。但就是这样一款强力软件,在面对如此之多的文件时也还是很乏力。

在复制过程中,我通过Windows任务管理器观察到,在发生读取的HDD上,除了读取速率,还有经常几百KB/s,少量10MB/s的写入速率。这很不正常,且增加了硬盘的响应时间,大大拖慢了我的复制速度。在经过一系列排查后,进行了将FastCopy移动到非复制源的硬盘上(因为FastCopy要写日志,会有写入动作),禁用了Windows Search服务等操作后,仍然无法消除额外的写入速率。于是我打开了Windows资源管理器(可以从任务管理器里打开),转到硬盘页面,准备查看是哪些进程在写哪些文件。最终发现是系统在读写该分区的NTFS主记录表,空闲簇记录表等NTFS分区专属的内容。至此问题显现,肯定是NTFS分区在读取文件的时候,需要更新什么东西或者写日志,导致不断有写入数据的行为发生。

面对这种问题,我首先去查了如何禁用NTFS的日志功能,但查找到的都是一些很危险的操作,我不敢尝试。最后还是群友61向我指出了问题所在:NTFS文件系统有“最后访问时间”这一字段,复制文件的时候会导致NTFS驱动更新这一字段,为22w个文件都更新这一字段,写入量可想而知。解决方法也很简单,以管理员身份执行命令:fsutil behavior disablelastaccess 1。该命令将在整个系统上(注意不是单个分区上)禁用“最后访问时间”这一特性,重启后生效。于是我立即执行了这一命令并重启了系统接着复制。果然,那几百KB/s的写入量消失了,我可以以极快的速度将消息记录复制出去了(尽管也复制了40分钟)。

当然,这个命令的副作用很明显,就是你以后再也看不到“最后访问时间”了。如果你很需要这个特性,可以执行fsutil behavior disablelastaccess 0来恢复(应该是这个指令,我没试过)。而我对于这一特性并没有强烈需求,我基本上只对创建时间这种字段有需求,而且取消这一特性还能加快复制速度,因此我就没有执行命令来恢复这一特性。