Usb FAT32可移动驱动器的文件写入速度

Usb FAT32可移动驱动器的文件写入速度,usb,fat32,Usb,Fat32,我正在尝试将许多文件写入格式化的USB闪存可移动驱动器FAT32。 我不是Windows内部事务的专家,因此我想征求您的经验和建议。 虽然大文件的写入速度受到USB和USB设备的限制,但小文件的写入速度却慢得离谱。 使用DiskMon,我可以看到Win7对每个文件的USB驱动器扇区写入的内容。 一些事实: 写入目录由8x 512字节扇区块完成,扇区块等于4KB,边界为4KB。 对FAT的写入由1-8x 512字节扇区块完成,最大为4KB,边界为4KB。 写入FAT扇区的数量取决于文件大小、群集大

我正在尝试将许多文件写入格式化的USB闪存可移动驱动器FAT32。
我不是Windows内部事务的专家,因此我想征求您的经验和建议。 虽然大文件的写入速度受到USB和USB设备的限制,但小文件的写入速度却慢得离谱。
使用DiskMon,我可以看到Win7对每个文件的USB驱动器扇区写入的内容。
一些事实:
写入目录由8x 512字节扇区块完成,扇区块等于4KB,边界为4KB。
对FAT的写入由1-8x 512字节扇区块完成,最大为4KB,边界为4KB。
写入FAT扇区的数量取决于文件大小、群集大小、扇区大小和FAT扇区边界的交叉。
一些方程式:
filetotalclusters=(filesize+clustersize-1)/clustersize
clusterspersector=sectorsize/4
fileFATsectors=filetotalclusters/clusterpersector,当FAT扇区边界交叉时可选+1扇区。
所以对于32KB集群和512字节扇区,1个FAT扇区覆盖4MB文件大小,8个扇区(4KB)覆盖32MB文件大小

not big file single block write (<32MB and FAT chain doesnt cross sector boundary):
create(),write(),close()  6 writes per file
1) create() write dir 4KB  (name of file, default attributes and current times)
2) write()  write file data
3)          write dir 4KB  (first cluster of chain)
4)          write FAT1 up to 4KB (chain of clusters)
5)          write FAT2 up to 4KB (chain of clusters)
6) close()  write dir 4KB (I guess it writes new file size)

bigger file or cross of FAT sector boundary and single block write:
create(),write(),close()  4+2x(ceiling of filesize/32MB) writes per file
1) create() write dir 4KB  (name of file, default attributes and current times)
2) write()  write file data
3)          write dir 4KB  (first cluster of chain)
4)          write FAT1 up to 4KB (chain of clusters)
5)          write FAT2 up to 4KB (chain of clusters)
6)          write FAT1 up to 4KB (continue chain of clusters)
7)          write FAT2 up to 4KB (continue chain of clusters)
8) close()  write dir 4KB (I guess it writes new file size)
So for long files added 2x(filesize/32MB) writes to the FAT.

with file times set
create(),setfiletime(),write(),close()  7 writes per file
1) create() write dir 4KB (name of file, default attributes and current times)
2) setfiletime() write dir 4KB  (new file times: creation,lastaccess,lastwrite)
3) write()  write file data
4)          write dir 4KB  (first cluster of chain)
5)          write FAT1 up to 4KB (chain of clusters)
6)          write FAT2 up to 4KB (chain of clusters)
7) close()  write dir 4KB (I guess it writes new file size)

with file length set before write to avoid fragmentation.
create(),setfiletime(),setlength(),write(),close()  7 writes per file
1) create() write dir 4KB (name of file, default attributes and current times)
2) setfiletime() write dir 4KB  (new file times: creation,lastaccess,lastwrite)
3) setlength() write dir 4KB (first cluster of chain and file size)
4)          write FAT1 up to 4KB (chain of clusters)
5)          write FAT2 up to 4KB (chain of clusters)
6) write()  write file data
7) close()  write dir 4KB  (I dont know what it writes as file times, file length and cluster already set)

if multiple block writes, 13 writes for 2 blocks write (<32MB and no FAT sector crossed) and more.
create(),setfiletime(),setlength(),write1(),write2(),writeX(),close() 
1) create() write dir 4KB (name of file, default attributes and current times)
2) setfiletime() write dir 4KB  (new file times: creation,lastaccess,lastwrite)
3) setlength() write dir 4KB (first cluster of chain)
4)          write FAT1 up to 4KB (chain of clusters)
5)          write FAT2 up to 4KB (chain of clusters)
6) write1() write file data block1
7) write2() write file data block2 (and it triggers write of buffered FAT and Dir sectors)
8-9..)      write multiple FAT1 and FAT2 depending on file size which should be already written on step 4 and 5.
10)         write dir 4KB which should be already written on step 3.
11) writeX() write file data blockX (and it triggers write of buffered FAT and Dir sectors)
12)         write dir 4KB which should be already written on step 3.
13-14..)    write multiple FAT1 and FAT2 depending on file size which should be already written on step 4 and 5
15) close()  write dir 4KB  (I dont know what it writes as file times, file length and cluster already set)
16-17..)    write multiple FAT1 and FAT2 depending on file size which should be already written on step 4 and 5

非大文件单块写入(只需先压缩所有这些文件。当然,编写单个归档文件而不是多个文件要快得多,我也能做到。但是,应用程序将无法工作,因为它们需要解压缩文件。例如Dism/Image:C:\test\offline/Add Driver/Driver:C:\drivers/RecurseJust先压缩所有这些文件。当然,编写单个归档文件而不是多个文件速度更快,我可以做到。但是,应用程序将无法工作,因为它们需要解压缩文件。例如Dism/Image:C:\test\offline/Add Driver/Driver:C:\drivers/Recurse