CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

一个关于内存映射文件的问题

楼主liangyufei(liangyufei)2006-08-03 17:32:06 在 VC/MFC / 进程/线程/DLL 提问

我想要在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,速度还是比较快的,但后面的就变得奇慢无比。请各位大虾帮忙看看是何原因导致。  
  问题点数:100、回复次数:13Top

1 楼liangyufei(liangyufei)回复于 2006-08-03 17:54:56 得分 0

还有,如果我想在3G大小的文件后面再添加数据,该如何做?Top

2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-08-03 21:40:56 得分 15

你要填内容,无论用什么方法都是快不了的。Top

3 楼liangyufei(liangyufei)回复于 2006-08-04 09:38:28 得分 0

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

4 楼teleinfor()回复于 2006-08-04 10:16:16 得分 20

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

5 楼liangyufei(liangyufei)回复于 2006-08-04 14:28:30 得分 0

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

6 楼booklove(纳海行云)回复于 2006-08-04 15:28:33 得分 10

你试试把一个3G的文件从一个盘拷到另一个盘需要多长时间Top

7 楼loucai(羽)回复于 2006-08-05 07:16:01 得分 5

markTop

8 楼cenchure(达到)回复于 2006-08-06 15:47:13 得分 20

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

9 楼liangyufei(liangyufei)回复于 2006-08-07 14:18:54 得分 0

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

10 楼liangyufei(liangyufei)回复于 2006-08-09 09:19:23 得分 0

难道就没人知道吗?Top

11 楼Analyst()回复于 2006-08-09 13:27:19 得分 20

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

12 楼liangyufei(liangyufei)回复于 2006-08-10 09:33:38 得分 0

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

13 楼herocloud(herocloud)回复于 2006-08-10 17:25:02 得分 10

有什么需求要这样硬盘操作?  
  设计方面多考虑一下  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:liangyufei
  • DentistryDoctor
  • teleinfor
  • booklove
  • loucai
  • cenchure
  • Analyst
  • herocloud

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo