Pergunta

Eu tenho um processo que utiliza uma grande quantidade de arquivos de memória mapeada.
O problema é que esses arquivos são mantidos na memória física, mesmo quando a máquina está com pouca memória, e outros processos requerem esta memória.

Eu tentei usar SetProcessWorkingSetSize para limitar o processo conjunto de trabalho, mas não ajuda, o processo de conjunto de trabalho continua a crescer acima do valor máximo.

Existe uma maneira melhor para limitar o processo de conjunto de trabalho?
Posso mudar heuristcs do Windows' para arquivos mapeados de memória de paginação?

Foi útil?

Solução 2

acabou usando a força bruta 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);
        }
}

Outras dicas

Se você achar que o seu processo com os arquivos de memória mapeada está segurando um monte de essas páginas, então isso significa que o sistema operacional não tem a necessidade de descartar qualquer de sua memória mapeada regiões para dar a outros processos. Então, como você sabe outros processos realmente precisa a memória actualmente usada para os arquivos mapeados? Só porque o sistema operacional é baixo em física meios RAM nada. Outros processos têm de memória demanda para fazer com que o OS para soltar suas páginas mapeadas e dar RAM para eles.

Assim, parece que o seu processo de mmap-I / O está morrendo de fome seu outro processo que usa RAM com menos frequência. Uma abordagem é para bloquear criteriosamente memória no processo que está sendo esfomeado. Olhada VirtualLock para win32.

Verifique minha resposta aqui ; com VirtualUnlock () você pode porções uncommit manualmente dos FMM; por exemplo, seções que você não pense que você vai estar acessando novamente em breve.

Eu acho que esse comportamento é devido à forma como MMF (arquivos de memória mapeada) trabalho. Ter um olhar para este artigo do blog . Ele explica que os arquivos MMF ignorar o processo de paginação do Windows e, portanto, não são apoiados pelo arquivo página. Em vez disso, o MMF se torna o backup de dados em si, o que significa, em última instância, ele ocupa mais memória RAM, uma vez que não está sendo páginas out (Er, eu não tenho certeza se eu conseguir que eu mesmo - melhor ler o blog)

Aqui está a documentação MSDN para a memória arquivos e mapeados aqui está outra questão SO relativas ao MMF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top