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();
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? –
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