问题背景:在程序中读写U盘的事做过很多次了,和读写硬盘一样,没有遇到什么特别的问题,所以没有在意。而这次,是要操作U盘里的一个大文件,比如600M,打开这个文件之后,我要每隔1M字节写1个扇区(512字节),结果发现每写1个扇区的时间是120ms,也就是说写入速度是5K字节/S,而我采用大数据块方式写这个U盘时的速度至少是1M字节/S。我想一定是我的操作有问题,但我没想到问题竟是这么复杂。 (1)我换了其它U盘,现象一样,排除了U盘的问题。 (2)我的U盘是2G,FAT16,每簇32K字节。我的操作系统是WIN2000。 (3)以下的测试这样来做:连续写100次,每次512字节(共51K字节),每写1次之后就将文件指针向后移动1M字节。耗时12s。 (3)尝试改变creatfile打开文件的方式,选择 无缓冲、为连续读写优化、为随机读写优化、独占方式打开,以上这些方式组合,某些情况下,程序本身可以快速返回,但是程序返回后U盘的灯一直在闪,估计是操作系统在后台写,实际花的时间和原来一样长。 (4)测试写100个扇区,但扇区中间无间隔,是连续的,速度很快,总耗时约250ms。 (5)仍然是间隔1M字节,但不是写,而是读100次,速度很块,耗时约100ms。 (6)仍然是间隔1M字节写100次,但每次写的不是512字节,而是1K或更多,结果发现:每次写的只要在128K字节以内,时间是差不多的。也就是说写1个扇区和写256个扇区花费相同的时间。 (7)难道是因为WINDOWS的缓冲机制的问题?尝试采用文件内存映射方式,先将所有的修改提交到内存映射文件中,最后1次刷新到U盘文件,结果时间差不多。 (8)尝试在WINDOWS下直接磁盘扇区读写方式,直接写物理扇区,测试的结果和前面相同。 (9)难道说每次要操作系统写1扇区时,它都会缓存或者写U盘128K字节?否则为什么写512字节和写128K字节时间是一样的呢?能否这样来测试:1次提交一个大数据块,但是操作系统要把它写到分散的扇区中,这样操作系统不会傻到每写1个分散的扇区还去缓存一大堆数据了吧? 实验这样做:我采用直接物理扇区读写方式,通过直接修改FAT中的文件簇链,创建了1个10M的文件,这个文件很特别,它在U盘上的位置非常不连续,共占据320个32K字节的簇、而相临的2簇之间在物理上相隔32个簇(1M字节)。然后我创建1个和文件一样大的数据块,一次写到文件,结果是:耗时395S,约120ms/簇,和前面的速度一样。 (10)众所周知,写U盘的1个扇区,不可能花费120ms的时间,我用单片机做的读写SD卡的东西,同样写零散的扇区,也只需要2ms。WINDOWS写U盘时究竟干了些什么?!各位大哥大姐,能否给个说得通的解释??
|