我想要在NTFS分区上创建一个3G大小的文件,同时文件内容全部为0xff。我用CreateFile,WriteFile的方法,大概耗时2分钟多,这个时间基本不能接受。网上人人都说内存映射文件速度快,我也试了一下,发现我的速度奇慢无比。代码如下:
void CTestNullDlg::OnButton7()
{
// TODO: Add your control notification handler code here
int i;
DWORD dwCount;
char szFile[MAX_PATH];
HANDLE hCacheFile;
DWORD dwIndexSize = 3*1048576000;//3G
char szMessage[200]; dwCount = GetTickCount(); DWORD dwRetSize;
sprintf(szFile,"d:\\TestCache\\test.bin");
DeleteFile(szFile); hCacheFile = CreateFile(szFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hCacheFile)
{
DWORD dwError = GetLastError();
LOG("\n Open cache file error,filename:%s,errornum=%d", szFile,dwError);
return ;
} BYTE szTmp[1024];
memset(szTmp,0xff,sizeof(szTmp)); DWORD dwWrite; HANDLE hFileMap = CreateFileMapping(hCacheFile, NULL, PAGE_READWRITE, 0, dwIndexSize, NULL);
int j;
for(i=0;i<3000;i++)
{
LPBYTE lpData = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, i*1024*1024, 1024*1024);
for(j=0;j<1024;j++)
{
memcpy(lpData+j*1024,szTmp,1024);
} UnmapViewOfFile(lpData);
}
CloseHandle(hFileMap); CloseHandle(hCacheFile);
sprintf(szMessage,"totol time=%d",GetTickCount()-dwCount);
MessageBox(szMessage);
}测试发现,在for(i=0;i<3000;i++)循环中,如果i<300,速度还是比较快的,但后面的就变得奇慢无比。请各位大虾帮忙看看是何原因导致。
void CTestNullDlg::OnButton7()
{
// TODO: Add your control notification handler code here
int i;
DWORD dwCount;
char szFile[MAX_PATH];
HANDLE hCacheFile;
DWORD dwIndexSize = 3*1048576000;//3G
char szMessage[200]; dwCount = GetTickCount(); DWORD dwRetSize;
sprintf(szFile,"d:\\TestCache\\test.bin");
DeleteFile(szFile); hCacheFile = CreateFile(szFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hCacheFile)
{
DWORD dwError = GetLastError();
LOG("\n Open cache file error,filename:%s,errornum=%d", szFile,dwError);
return ;
} BYTE szTmp[1024];
memset(szTmp,0xff,sizeof(szTmp)); DWORD dwWrite; HANDLE hFileMap = CreateFileMapping(hCacheFile, NULL, PAGE_READWRITE, 0, dwIndexSize, NULL);
int j;
for(i=0;i<3000;i++)
{
LPBYTE lpData = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, i*1024*1024, 1024*1024);
for(j=0;j<1024;j++)
{
memcpy(lpData+j*1024,szTmp,1024);
} UnmapViewOfFile(lpData);
}
CloseHandle(hFileMap); CloseHandle(hCacheFile);
sprintf(szMessage,"totol time=%d",GetTickCount()-dwCount);
MessageBox(szMessage);
}测试发现,在for(i=0;i<3000;i++)循环中,如果i<300,速度还是比较快的,但后面的就变得奇慢无比。请各位大虾帮忙看看是何原因导致。
算法是不大可能改的。如果把mapviewfile 放到for 外面,那么内存可能溢出。第二个循环我是模拟写操作,因为我要写的数据都是1K左右大小的。
我觉得可能还是我代码的问题,请各位大虾帮忙看看!
另外创建文件选用这个参数组合:CreateFile(szFile,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);