现在有三个进程,可能都要从数据库中读取同一份文件,大家都知道这个原理,先从硬盘上读取数据,然后放入内存中,再读取内存中的数据!
    但是现在这个数据可能很大,会造成内存不足,我的目的就是通过文件映射再创建一块虚拟内存的方法,把这三个进程的可能都要访问到的数据先放入这个虚拟内存中,同时就可以读取这些数据了。
    比如说吧,有一个很大的二维或者三维数组,有三个函数要对它进行访问,可是每次都可能要把这个数组都放入内存中,现在就是把这个数组给放在虚存中了,每次读都读虚存里的数据就可以了!请大家给些好的方法,或者一些可行的代码。谢谢。分不够再给。这是一个很挑战性的工作,希望每个人都能留下一点意见。

解决方案 »

  1.   

    用内存映射文件,多大的文件都可以访问到;
    HANDLE hFile = CreateFile(...);
    HANDLE hMap = CreateFileMapping(...); 
    LPVOID ptr = MapViewOfFile(...);
      

  2.   

    to ymbymb: 大于2G的文件就不成,内存空间不够windows nt开始以后就支持大于2G的文件了
      

  3.   

    作一个dll,把数据放在共享段中,当然还需要添加一些同步机制
      

  4.   

    同意VirtualAlloc.32位的Windows除了Windows Advance Server支持3G内存寻址外,其他的都最大支持2G
    Windows 2003不知道。所以我们要64位OS.这样我们就不必外硬盘上自己倒了。
      

  5.   

    第一步:创建文件对象,有两个函数
        HFILE WINAPI OpenFile(LPCSTR lpFileName,LPOFSTRUCT lpReOpenBuff,UINT uStyle);
        可以这样调用
          HFILE hfile;
          OFSTRUCT of;
          hfile=OpenFile("File.dat",&of,OF_READ|OF_SHARE_EXCLUSIVE);
          if(hfile==-1)
          {//Error}
         还有一个
         HFILE hfile;
         hfile=CreateFile(achFile,//Filename
                          GENERIC_READ,//Access mode
                          0,//Share
                          0,//Security
                          OPEN_EXISTING,//Create flags
                          FILE_ATTRIBUTE_NORMAL,//File attributes
                          0);//File emulate
          if(hfile==-1)
          {//Error}
    第二步:创建文件映射对象
          HANDLE hfm;
          hfm=CreateFileMapping(hfile,
                                0,//Security Ptr
                                PAGE_READONLY,//Pg protection
                                0,//Size of high 32 bits
                                dwFileSize,//Size of low 32 bits
                                0);Mapping name
    共享单一文件映象的方式之一是给这个文件映象起一个名称,然后当两个或多个进程用同一个名称调用CreateFileMapping时,就可以共享     
      

  6.   

    用virtualalloc会影响速度的。用文件映射比较好,而且基本上他所支持的文件大小应该能满足你的要求了。