2010-11-17 5 views
1

J'ai ce code de test qui consiste simplement à mapper environ 7500 fichiers à la mémoire virtuelle, puis à le démapper. J'ai fait ceci pour vérifier mon utilisation de RAM (mon utilisation de mémoire virtuelle est très bien). Quand je lance cette application, ma mémoire physique devient dangereusement basse et tout ralentit vraiment (je cours sur une machine RAM de 4 Go XP 32 bits SP3). Est-ce que n'importe quel corps sait comment je peux résoudre ceci? (J'ai cherché et trouvé que VirtualUnlock peut être utile, mais quand je l'ai essayé n'a pas fait de différence). Voici le code:Comment libérer de la mémoire physique lors de l'utilisation de fichiers mappés en mémoire?

int COUNT = 7759; 

    cout<<"Press a key to start\n"; 
    getchar(); 
    int i = 1; 
    for(i = 1; i <= COUNT; ++i) 
    { 
     CString s; 
     s.Format(_T("E:\\Images\\CD5\\04221155\\2 (%d)"), i); 
     HANDLE hFile = CreateFile(s, 
      GENERIC_READ | GENERIC_WRITE, 
      FILE_SHARE_READ | FILE_SHARE_WRITE, 
      NULL, 
      OPEN_EXISTING, 
      FILE_ATTRIBUTE_NORMAL, 
      NULL); 

     if(hFile == INVALID_HANDLE_VALUE) 
     { 
      TCHAR buf[256] = {0}; 
      DWORD er = GetLastError(); 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0); 
      cout<<"Unable to open file, Error is:"; 
      wcout<<buf; 
      cout<<"\n"; 
      break; 
     } 
     DWORD filesize = 0; 
     filesize = GetFileSize(hFile,&filesize); 

     HANDLE hMapFile = CreateFileMapping(hFile, 
      NULL, 
      PAGE_READWRITE, 
      0, 
      filesize, 
      NULL); 

     if(hMapFile == NULL) 
     { 
      cout<<"Unable to create file mapping object. Error is:"; 
      TCHAR buf[256] = {0}; 
      DWORD er = GetLastError(); 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0); 
      wcout<<buf; 
      cout<<"\n"; 
      break; 
     } 

     char* pBuf = (char*) MapViewOfFile(hMapFile, 
      FILE_MAP_ALL_ACCESS, 
      0, 
      0, 
      filesize); 



     if(pBuf == NULL) 
     { 
      TCHAR buf[256] = {0}; 
      DWORD er = GetLastError(); 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, er, 0, buf, 256, 0); 
      cout<<"Unable to map the file to virtual memory, Error is:"; 
      wcout<<buf; 
      CString s1; 
      s1.Format(_T("%x"), hMapFile); 
      cout<<"Handle is:"<<s1; 
      cout<<"\n"; 
      break; 
     } 

     if(i % 100 == 0) 
     { 
      cout<<"Mapped "<<i<<"\n"; 
     } 

     memset(pBuf, 0, filesize); 

     //VirtualUnlock(pBuf, filesize); 
     UnmapViewOfFile(pBuf); 
     CloseHandle(hMapFile); 
     CloseHandle(hFile); 
    } 

    cout<<"finished i is "<<i<<"\n"; 
    getchar(); 
+0

Avec votre application en tant que processus 32 bits, comment la mémoire physique devient dangereusement faible sur une machine de 4 Go? Avez-vous essayé d'utiliser SetProcessWorkingSetSize pour forcer votre application à sortir la page sur le disque? –

+0

Mon application n'est pas le seul processus en cours .. il y a d'autres processus aussi .. mon application juste manger trop de RAM – Naveen

Répondre

3

Vous utilisez des MMF de la pire manière possible. Mapping une fois, en frappant chaque page et en fermant immédiatement la cartographie. Votre programme génère un nombre important de défauts de page. Quelque chose que vous pouvez facilement voir dans Taskmgr.exe, l'onglet Processus, View + Select Columns pour ajouter les colonnes de faute de page. Oui, les défauts de page sont assez coûteux à obtenir tant d'entre eux vont sensiblement affecter le fonctionnement de la machine. La RAM est normale, vous en utilisez beaucoup. Je réalise qu'il s'agit d'un test de synthèse. Si votre vrai code ressemble à ceci (ne profitant jamais de la mise en cache et de l'écriture paresseuse), n'utilisez pas les fichiers MMF.

+0

Je me rends compte que. Je l'ai fait intentionnellement afin que toutes les pages sont touchées .. je voulais voir comment la mémoire physique réagit à cela ..mais ce que je ne comprends pas est même après UnmapViewOfFile l'utilisation de la RAM très élevé – Naveen

+0

Eh bien, couper le jeu de travail. Un moyen rapide est de minimiser la fenêtre principale de votre application. –

+0

@Naveen N'oubliez pas que souvent le système d'exploitation ne récupère pas la mémoire désallouée d'une application avant la fin de l'application. –

Questions connexes