我想要在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,速度还是比较快的,但后面的就变得奇慢无比。请各位大虾帮忙看看是何原因导致。

解决方案 »

  1.   

    网上不是说写文件用内存映射文件也比普通的WriteFile快很多吗?为何现在的结果不是这样的呢?
      

  2.   

    你怎么知道这种方法不够快?!这种方法本身已经是很快了,但是不可能1s写完3GB啊.你的关键不是内存映射问题,而是写入数据的问题.
      

  3.   

    我也不要求在1s写完3GB,我只希望在1分钟内写完3GB,但现在是10分钟也写不完3G。
      

  4.   

    你把算法改一下 , 把 2 个for  loop 改为一个 ,  mapviewfile 再放到for 外面 ,map 一次试试
      

  5.   

    3G的文件从一个盘拷到另一个盘需要2分钟左右时间。
    算法是不大可能改的。如果把mapviewfile 放到for 外面,那么内存可能溢出。第二个循环我是模拟写操作,因为我要写的数据都是1K左右大小的。
    我觉得可能还是我代码的问题,请各位大虾帮忙看看!
      

  6.   

    这里不要用FileMapping,因为你是只写,而用FileMapping的时候会先读再写,这样造成硬盘频繁的读取写入,所以会很慢。这里直接用WriteFile就可以了,每次写入的量不要太大,64K足矣(具体大小由实验决定)。 
    另外创建文件选用这个参数组合:CreateFile(szFile,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
      

  7.   

    我最后要实现的功能是对大文件(>3G)的快速读写,且要求占用内存较小。测试代码中只是针对写,但发现效果不佳。请各位大虾帮忙看看有何方法达到此目的,谢谢!