[英]Why is file concatenation on Windows so slow?
我正在开发一个小型实用程序应用程序,以连接大型视频文件。 主要的串联步骤是在Windows 7的命令行上运行以下操作:
copy /b file1.dv + file2.dv + file3.dv output.dv
输入文件很大-通常每个文件7-15GB。 我知道我在这里处理大量数据,但是二进制连接需要很长的时间-总共大约40GB的数据,将近一个小时。
考虑到该过程基本上只是对每个文件的扫描,并将其内容复制到新文件中,为什么二进制副本这么慢?
内置命令copy
是在DOS时代设计的,从那以后还没有真正更新过。 因此,它是为具有小磁盘和很小主存储器的计算机设计的。 结果,它在复制内容时使用很小的缓冲区。 对于典型的工作量; 这没什么大不了的,但是对于您要处理的特定情况而言,效果并不理想。
就是说,考虑到您所描述的情况,我认为复制不会进展得这么慢。 如果一个40 GB的文件大约需要一个小时,则意味着您获得的速度约为11 MB / s 。 像您在评论中描述的那样,典型的商用Dell笔记本电脑通常配备5400 RPM消费型硬盘,在理想的连续读取和读取条件下,它们可以达到30MB / s(磁盘末端)到60MB / s(磁盘开始)之间的速度。写道。 但是,您的工作负载不是顺序工作负载; 这是读/写磁头从源文件到目标文件的恒定偏移。 此类磁盘的典型延迟时间为16ms,每秒大约有60次寻道,或每秒30次复制操作。 这意味着该副本使用的缓冲区大约为11MB / 30 =大约375k,这很方便(在您考虑了copy
的代码大小和一些DOS设备驱动程序之后)适合该副本最初设计的640k上限。 所有这些都假定您的磁盘在理想条件下运行,并且具有足够的剩余空间,允许这些读取和写入实际上在复制操作中是顺序的。
当然,如果您同时执行其他任何操作,这将导致更多的查找操作,并且您的性能会更糟。
如果您使用另一个专为大型复制操作设计的应用程序,并且因此使用较大的缓冲区,则可能会得到更好的结果(可能快两倍)。 但是我不知道有任何这样的应用程序。 如果您需要的话,您可能需要自己写一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.