如何实现文件的快速复制?(50分)

  • 主题发起人 主题发起人 hxy2002
  • 开始时间 开始时间
毫无疑问使用API是效率最快的!但想同时...
 
如果光驱和硬盘都接在一个不同的IDE口,让两个设备双工,就像GGCAT所说的。
这样会加快文件的复制吗?
 
会的,而且本身光驱和硬盘就不要接在同一个IDE线上,还有最好打开光驱的DMA,这样还会快一些.
 
光驱和硬盘的速度不是一个数量级别的,最大52*0.15=7.8m,ide 7200 30~50M/s。我觉得这个提法很不错,但受限于硬件性能,不会有很明显的效果。
 
呵呵,一个线程就够了,这个速度和硬盘有关系的,IDE硬盘可以说是单线程工作的,
具体原因以前的帖子里讨论过的。
 
TO:张无忌

我是从光驱读,硬盘写的。

不是都在一个硬盘读和写的。
 
多线程读写文件?嗬嗬,除非自己写raid系统!
用文件内存映像最快!过程如下:
CreateFileMapping
MapViewOfFile 映像源文件
创建目标文件,关闭再打开(这一点很重要,如果没有这一步,看起来代码没有冗余,但执行效率会降低1倍,具体原因我不知道!),建立目标文件的内存映像,注意文件大小和源文件一样!!
把源文件映像的字节拷贝至目标文件字节,可用汇编,呵呵
UnmapViewOfFile 关闭两个文件
就可以了
我试过,和windows系统拷贝文件速度一样!!

 
我感觉瓶颈是硬件的I/O,软件再怎么优化作用都不大
 
是这样的读写都需要一定的时间,而且现在的硬盘数据都是采用的DMA传输,在读写的时候,只有操作该I/O的线程挂起等待数据,CPU则被释放出来。
当单线程来进行操作时,每个数据块要经历读数据和写数据的两个序列化阶段,考虑到硬盘的写速度比读慢,因此至少需要两个写操作的时间。如果读写线程并列的话,这两个阶段就会重叠(条件是读写是发生在两个单独的数据通道)。实际测试,在我的机器上。从7200rpm的硬盘复制到4500rpm的硬盘,单线程只能跑到12MB/S,双线程跑到了16MB/S,接近了写硬盘的峰值速度。反过来从4500rpm->7200rpm则跑到了22MB/S。
当然了,从CD-ROM复制的速度肯定没这么快,但是如果真的是从CD-ROM来读的话,双线程绝对是有意义的,可以避免因为写过程的短暂等待导致光驱再次读数据的启动延迟,光驱的寻道是很慢的哦。现在光驱基本可以做到48X读,综合内外圈因素平均速度在30x左右,大概是4.5MB/S,我想双线程应该可以达到这个理想值。
 
同意GCCAT的说法。
现在就差代码了.
看实际效果如何了。
 
代码很简单,还是用
CreateFileMapping
MapViewOfFile
建立两个内存块(实际大小是你读取分段数据的大小+1,这样可以让最后一个字节作为读取完成的操作标识符,读取完成就把最后一个字节改成非0,正在读取就把最后一个字节改成0),建立完成后,首先清空内存块内的垃圾数据,然后启动读线程,让读线程读取光盘数据,保存到第一个内存块里面,保存完毕后, 继续让一个线程往第二块内存中写数据,同时把第一块内存的最后一个表示字节改成非0,再立刻启动写线程,写线程判断第一块内存的标识符是否是非0,如果是,就Copy整个内存块到磁盘上,并最后改内存块最后一个字节为0,接着写线程去检查第二块内存是否读出完毕(就是检查第二块内存的标识符字节)。依次循环,直到两个内存块数据全部读写完毕,并被终止,即可完成这个操作。
 
后退
顶部