在Windows平台采用VS 2010 C++语言开发多进程并发写文件操作主要采用CreateFile及WriteFile函数,参数组合要达到最高性能,请注意以下的设置。
CreateFile
FileHandle =::CreateFileA(FileNamePattern, GENERIC_WRITE, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
访问方式:只写采用GENERIC_WRITE, 只读采用GENERIC_READ。
共享方式:FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,允许其它人读、写、删除,如果要允许删除或改名请注意在CreateFile后记住GetFileTime文件创建时间,写文件前先判断当前文件GetFileTime创建时间和打开文件时是否一致。
打开方式:OPEN_ALWAYS,存在则打开,否则创建新文件。
SetFilePointer
写文件前先设置文件位置到文件尾部
::SetFilePointer(FileHandle, 0, NULL, FILE_END)
::WriteFile(FileHandle, buf, strlen(buf), &n, NULL);
刷新缓存到磁盘,注意没有特别要求不要采用,性能极低。
::FlushFileBuffers(FileHandle);
并发锁定,在高并发时多线程写会造成写文件重叠,要针对文件写操作采用CreateMutex创建互斥对象,参数以文件全路径为基础去除特殊字符(\, : , / )。
经过以上处理,单一线程写操作10000次 / 秒以上,多进程写可以达到60000次 / 秒。
注意如果涉及到判断文件大小,最好采用GetFileSizeEx,可以支持4GB以上的文件大小判断。
long long size = 0;
::GetFileSizeEx(hFile, (PLARGE_INTEGER)&size);
如果要在指定位置写入要采用SetFilePointerEx, 可以在4GB以上范围定位。
long long size = 1000;
::SetFilePointerEx(hFile, *(LARGE_INTEGER *)&size, NULL, FILE_BEGIN);
|