Pregunta

Tengo un proceso que utiliza una gran cantidad de archivos asignados a la memoria.
El problema es que esos archivos se guardan en la memoria física, incluso cuando la máquina tiene poca memoria, y otros procesos requieren esta memoria.

He intentado usar SetProcessWorkingSetSize para limitar el conjunto de trabajo del proceso, pero no ayuda, el conjunto de trabajo del proceso sigue creciendo por encima del valor máximo.

¿Hay una mejor manera de limitar el conjunto de trabajo del proceso?
¿Puedo cambiar los heuristcs de Windows para los archivos asignados de memoria de paginación?

¿Fue útil?

Solución 2

Terminé usando fuerza bruta Desbloqueo virtual.

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);
        }
}

Otros consejos

Si encuentra que su proceso con los archivos asignados a la memoria se está aferrando a muchas de esas páginas, eso significa que el sistema operativo no ha necesitado descartar ninguna de las regiones asignadas a la memoria para realizar otros procesos. Entonces, ¿cómo sabe que otros procesos realmente necesitan la memoria actualmente utilizada para los archivos asignados? Solo porque el sistema operativo es bajo en RAM física no significa nada. Otros procesos tienen que exigir memoria para hacer que el sistema operativo elimine las páginas asignadas y les dé RAM.

Entonces, parece que su proceso de E / S de mmap está matando a su otro proceso que utiliza RAM con menos frecuencia. Un enfoque es bloquear juiciosamente la memoria en el proceso que se está muriendo de hambre. Mira a VirtualLock para win32.

Verifique mi respuesta aquí ; con VirtualUnlock () puede descomprimir manualmente partes de los FMM; por ejemplo, las secciones a las que no cree que accederá de nuevo pronto.

Creo que este comportamiento se debe a cómo funciona MMF (archivos asignados en memoria). Echa un vistazo a este artículo de blog. Explica que los archivos MMF omiten el proceso de paginación de Windows y, por lo tanto, no están respaldados por el archivo de página. En cambio, el archivo MMF se convierte en la copia de seguridad de los datos en sí mismo, lo que significa que, en última instancia, ocupa más memoria RAM, ya que no se están agotando las páginas (Er, no estoy seguro de que lo obtenga yo mismo, ¡lo mejor es leer el blog!)

Aquí está la documentación de MSDN para los archivos de memoria asignados y aquí otra pregunta de SO relacionada con MMF.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top