Winapi 大文件大小上顺序i/o操作的优化 编译程序:微软C++ 2005 BR>硬件:AMD 64位(16 GB)

Winapi 大文件大小上顺序i/o操作的优化 编译程序:微软C++ 2005 BR>硬件:AMD 64位(16 GB),winapi,optimization,fstream,large-files,Winapi,Optimization,Fstream,Large Files,通过以下时间、文件访问和文件结构特征提交18GB文件的顺序只读访问:18184359164(文件长度)11240476672(ntfs压缩文件长度) 时间文件方法磁盘 14:33? 压缩流固定磁盘 14:06普通fstream固定磁盘 12:22普通winapi固定磁盘 11:47压缩winapi固定磁盘 11:29压缩流ram磁盘 10:37压缩winapi ram磁盘 7:18压缩7z存储解压缩到ntfs 12gb ram磁盘 6:37正常拷贝到同一卷固定磁盘 fstream构造函数和访问


通过以下时间、文件访问和文件结构特征提交18GB文件的顺序只读访问:
18184359164(文件长度)
11240476672(ntfs压缩文件长度)

时间文件方法磁盘 14:33? 压缩流固定磁盘 14:06普通fstream固定磁盘 12:22普通winapi固定磁盘 11:47压缩winapi固定磁盘 11:29压缩流ram磁盘 10:37压缩winapi ram磁盘 7:18压缩7z存储解压缩到ntfs 12gb ram磁盘 6:37正常拷贝到同一卷固定磁盘

fstream构造函数和访问:

Time File Method Disk 14:33? compressed fstream fixed disk 14:06 normal fstream fixed disk 12:22 normal winapi fixed disk 11:47 compressed winapi fixed disk 11:29 compressed fstream ram disk 10:37 compressed winapi ram disk 7:18 compressed 7z stored decompression to ntfs 12gb ram disk 6:37 normal copy to same volume fixed disk define BUFFERSIZE 524288 unsigned int mbytes = BUFFERSIZE; char * databuffer0; databuffer0 = (char*) malloc (mbytes); datafile.open("drv:/file.ext", ios::in | ios::binary ); datafile.read (databuffer0, mbytes); 定义缓冲区大小524288 无符号整数MB=缓冲区大小; char*databuffer0;databuffer0=(字符*)malloc(兆字节); 打开(“drv:/file.ext”,ios::in | ios::binary); datafile.read(databuffer0,MB);

winapi构造函数和访问:

Time File Method Disk 14:33? compressed fstream fixed disk 14:06 normal fstream fixed disk 12:22 normal winapi fixed disk 11:47 compressed winapi fixed disk 11:29 compressed fstream ram disk 10:37 compressed winapi ram disk 7:18 compressed 7z stored decompression to ntfs 12gb ram disk 6:37 normal copy to same volume fixed disk define BUFFERSIZE 524288 unsigned int mbytes = BUFFERSIZE; char * databuffer0; databuffer0 = (char*) malloc (mbytes); datafile.open("drv:/file.ext", ios::in | ios::binary ); datafile.read (databuffer0, mbytes); 定义缓冲区大小524288 无符号整数MB=缓冲区大小; 常量TCHAR*constfilex=_T(“drv:/file.ext”); char ReadBuffer[BUFFERSIZE]={0}; hFile=CreateFile(filex,GENERIC\u READ,FILE\u SHARE\u READ,NULL,OPEN\u EXISTING,FILE\u ATTRIBUTE\u NORMAL,NULL); if(FALSE==ReadFile(hFile、ReadBuffer、BUFFERSIZE-1和dwBytesRead,NULL)) { ...

对于fstream方法,->16MB缓冲区大小不会减少处理时间。对于winapi方法,所有大于.5MB的缓冲区大小都会失败。哪些方法会优化此实现以减少处理时间?

是否尝试内存映射文件?在我的测试中,这始终是读取大型文件的最快方法

更新:这里是对内存映射文件的一个古老但仍然准确的描述: 试试这个

define BUFFERSIZE 524288 unsigned int mbytes = BUFFERSIZE; const TCHAR* const filex = _T("drv:/file.ext"); char ReadBuffer[BUFFERSIZE] = {0}; hFile = CreateFile(filex, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( FALSE == ReadFile(hFile, ReadBuffer, BUFFERSIZE-1, &dwBytesRead, NULL)) { ... 然后是阅读循环。在iPad上打字时省略了一些小细节

hf = CreateFile(..... FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED ...)
以上是您需要的要点。我们使用它并实现高I/O吞吐率,但您可能需要稍微改进它以实现最终性能。我们发现4个优秀的I/O最适合我们使用,但这会因平台而异。每个IO读取少于1Mb是性能负向的。一旦您读取了缓冲区,请不要然后在读取循环中使用它,发送到另一个线程,并分配另一个缓冲区(但是从重用队列中获取它们,不要继续使用malloc)。上述操作的总体目的是尝试将4个未完成的IO打开到磁盘,一旦没有,总体性能将下降

此外,这在只读取文件的磁盘上效果最好。如果您同时开始在同一磁盘上读取/写入不同的文件,性能会迅速下降,除非您有SSD磁盘


不确定为什么您的readfile无法使用0.5Mb缓冲区,只是仔细检查了一下,我们的live prod代码使用4Mb缓冲区



根据ramdisk实现,系统开销是否如此之高,以至于内存映射顺序访问的文件具有更高的访问时间?我曾预料到,看着数据源从固定磁盘更改为ramdisk要使处理时间减少10倍…最终是通过使用大数据块读取而不是使用在线内存来实现的。Windows操作系统中是否有节流机制?…

此外,内存映射文件将需要一层用户编写的(?)压缩,以将18GB文件压缩到12GB(16GB)中可用系统内存…内存映射与缓存和内存子系统一起工作。这使得更好的优化成为可能。您可以映射比物理内存大的文件,无需压缩。操作系统将要求在读取时从文件交换入/出页面。不,没有节流机制(默认情况下已启用)。您可以限制Windows上的IO,但必须特别要求/实现它。