为什么Windows上的文件串联这么慢?

时间:2012-07-28 03:48:59

标签: windows copy concatenation

我正在开发一个小型实用程序应用程序来连接大型视频文件。主要的连接步骤是在Windows 7的命令行上运行类似的东西:

copy /b file1.dv + file2.dv + file3.dv output.dv

输入文件很大 - 每个通常为7-15GB。我知道我在处理大量数据,但二进制连接需要很长时间 - 总共大约40GB的数据,它可能差不多一个小时。

考虑到该过程基本上只是扫描每个文件并将其内容复制到新文件,为什么二进制副本这么慢?

1 个答案:

答案 0 :(得分:1)

内置命令copy是在DOS时代设计的,并且从那时起就没有真正更新过。因此,它专为具有小磁盘和非常小的主存储器的机器而设计。因此,它在复制周围时使用非常小的缓冲区。对于典型的工作负载;这没什么大不了的,但是对于你正在处理的具体案例来说做得并不好。

那就是说,鉴于你所描述的情景,我不认为副本会慢慢发生。如果一个40千兆字节的文件需要大约一个小时,这意味着你的速度大约为11 MB/s。您在评论中描述的典型商品戴尔笔记本电脑通常配备5400 RPM消费者硬盘,在理想的顺序读取条件下,可以达到30MB / s(磁盘末端)到60MB / s(磁盘开头)的速度。写道。但是,您的工作负载不是顺序工作负载;它是读/写磁头从源文件到目标文件的不断转换。这类磁盘的典型延迟时间为16毫秒,每秒约60次,或每秒30次复制操作。这意味着副本使用大约11MB / 30 =大约375k的缓冲区,这方便地(在您考虑copy代码的大小和一些DOS设备驱动程序之后)适合复制的640k上限最初是为。这一切都假设您的磁盘在理想条件下运行,并且有足够的剩余空间,允许这些读取和写入在复制操作中实际上是顺序的。

当然,如果你同时做其他事情,这会导致更多的搜寻行动,你的表现会更差。

如果您使用另一个专为大型复制操作而设计的应用程序,您可能会获得更好的结果(可能快两倍),因此使用更大的缓冲区。我不知道任何这样的应用程序;如果那就是你需要的话,你可能需要自己写一个。