一个5G的文件好像不能用内存映射文件一次映射完成,MapViewOfFile最后一个参数dwNumberOfBytesToMap如果大于0x5fffffff在我的机器上就不成功,返回null。我的机器内存是1G大,虚拟内存设到4096MB最大。程序如下:
HANDLE hFile=CreateFile("D:\\DATA\\DATA200.dat",
GENERIC_READ,
         FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
HANDLE hFileMapping=CreateFileMapping(hFile,
  NULL,
  PAGE_READONLY,
  0x00000000,   //这个高位是不是必须为0?
  0xffffffff,   //低位已经设到最大
  NULL);
LPVOID pVoid=MapViewOfFile(hFileMapping,
                           FILE_MAP_READ,
                           0,0,
                           0x5fffffff);//最后这个参数我只能设到比这个小
                                         否则函数返回null请问我的程序有问题吗?有没有办法一次映射5G甚至20G的大数据文件,请提供解决方案。诚恳请教。多谢。

解决方案 »

  1.   

    你的文件系统是什么,要是fat16/32就不要指望了,可以去看一下fat32的规范,它最大支持4g的文件,要是ntfs倒是没有事
      

  2.   

    多谢蝴蝶夜雪兄回复,我的文件系统是ntfs的,为什么还是不能一次映射5G的文件?是不是要在VC里设置什么?请指教。
      

  3.   

    用GetLastError()查看得到8的错误代码,即Not enough storage is available to process this command. 请指教。
      

  4.   

    to coolsun1858():
    不好意思,那样的话,我就不知道了,我只在驱动里处理过那么大的文件,app没有试过to xhwu3721(granite)
    什么是??我也不知道,请一起指教我们啊.对了,警告一下coolsun1858(),我可不是"兄"啊, 呵呵 :)
      

  5.   

    一个进程只能访问4G的空间吧,5G的内存映射文件,怎么读?地址空间全占了都不够。小弟不才,不甚理解。给楼主UP一下吧
      

  6.   

    看的 lytt(流雨亭)话,我觉得满合理的,原来真的没有注意,可能真是那样吧,地址满了就没有地方可供映射了但是 sky51fly(sky) 说"微软的操作系统最大只支持4G的文件"肯定不对,我就建过4g以上的文件
      

  7.   

    现在我发现想映射大一点比如3G,也不行哦.程序如下:
    HANDLE hFile=CreateFile("D:\\DATA\\DATA200.dat",
    GENERIC_READ,
             FILE_SHARE_READ,
    NULL,
    OPEN_ALWAYS,
    FILE_FLAG_SEQUENTIAL_SCAN,
    NULL);
    HANDLE hFileMapping=CreateFileMapping(hFile,
      NULL,
      PAGE_READONLY,
      0x00000000,   
      0xB2D05E00,   //这个值为3000000000大小,可以映射成功
      NULL);
    LPVOID pVoid=MapViewOfFile(hFileMapping,
                               FILE_MAP_READ,
                               0,0,
                               0);    //最后这个参数为0表示全部映射上面那个大小
                                      //但MapViewOfFile返回为NULL
                                      //此时GetLastError查出为5,
                                      //即出错原因Access is denied. 除非CreateFileMapping函数第五个参数小于0x59682F00(1.5G左右),MapViewOfFile
    才能成功,请问为何出错为Access is denied.
    我的机器内存是1G大,虚拟内存设到4096MB最大,操作系统为winserver 2003企业版,
    操作系统可以管理32G内存。
    谢谢大家。
      

  8.   

    这应该和WIN32下 进程的地址空间有关吧.
    去查一下<<Advanced Windows>>,看看吧
      

  9.   

    内存映射文件是映射到2G以上的空间,所以理论上最大也只能是2G,而且2G以上的空间还要
    给一些DLL占用,所以实际可用的空间是远远少于2G的
      

  10.   

    john能详述吗?或指点在哪能查到资料。多谢!