Question

J'ai un processus qui utilise beaucoup de fichiers mappés en mémoire.
Le problème est que ces fichiers sont conservés dans la mémoire physique, même lorsque la machine manque de mémoire, et que les autres processus nécessitent cette mémoire.

J'ai essayé d'utiliser SetProcessWorkingSetSize pour limiter le groupe de travail du processus, mais cela n’aide en rien, le groupe de travail du processus continue de croître au-delà de la valeur maximale.

Existe-t-il un meilleur moyen de limiter l'ensemble de travail du processus?
Puis-je modifier les heuristiques de Windows pour la pagination des fichiers mappés en mémoire?

Était-ce utile?

La solution 2

Nous avons fini par utiliser brute force VirtualUnlock.

PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo( hProcess, &pmc, sizeof(pmc)) )
{
        if (pmc.WorkingSetSize > MaxWorkingSetSize)
        {
                VirtualUnlock(FilePtr.pData, MaxWorkingSetSize);
                UnmapViewOfFile(FilePtr.pData);
                CloseHandle(FilePtr.hFileMap);
                CloseHandle(FilePtr.hFile);
        }
}

Autres conseils

Si vous constatez que votre processus contenant les fichiers mappés en mémoire conserve beaucoup de ces pages, cela signifie que le système d’exploitation n’a pas eu besoin de supprimer aucune de vos régions mappées en mémoire pour la transmettre à d’autres processus. Alors, comment savez-vous que d'autres processus ont réellement besoin de la mémoire actuellement utilisée pour les fichiers mappés? Juste parce que le système d'exploitation est faible en RAM physique ne signifie rien. D'autres processus doivent demander de la mémoire pour que le système d'exploitation abandonne vos pages mappées et leur donne de la mémoire vive.

Il semble donc que votre processus mmap-I / O prive votre autre processus, qui utilise moins souvent la RAM. Une approche consiste à verrouiller judicieusement la mémoire dans le processus en cours de famine. Regardez VirtualLock pour win32.

Vérifiez ma réponse ici ; avec VirtualUnlock (), vous pouvez manuellement désengager des parties des fichiers MMF; par exemple, des sections auxquelles vous ne pensez pas avoir bientôt accès.

Je pense que ce problème est dû au fonctionnement de MMF (Memory Mapped Files). Consultez cet article . Il explique que les fichiers MMF ignorent le processus de pagination Windows et ne sont donc pas sauvegardés par le fichier d'échange. Au lieu de cela, le fichier MMF devient la sauvegarde de données en elle-même, ce qui signifie qu’en fin de compte, il prend plus de RAM car ce ne sont pas des pages (euh, je ne suis pas sûr de le comprendre moi-même - mieux vaut lire le blog!)

Voici la documentation MSDN relative aux fichiers mappés en mémoire et voici une autre question SO relative au MMF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top