Estoy escribiendo un programa (un probador de teoremas tal como sucede) cuyo requisito de memoria es "tanto como sea posible, por favor"; es decir, siempre puede hacerlo mejor usando más memoria, para fines prácticos sin límite superior, de modo que lo que realmente necesita hacer es usar tanta memoria como esté disponible, ni más ni menos. Puedo descifrar cómo priorizar los datos para eliminar las cosas de menor valor cuando la memoria se agota; el problema que estoy tratando de resolver es cómo saber cuándo está sucediendo esto.Manteniendo el uso de la memoria dentro de la cantidad disponible
Idealmente me gustaría una llamada al sistema que devuelva "cuánta memoria queda" o "¿todavía no tenemos memoria?"; por lo que puedo decir, ¿no existe tal cosa?
Por supuesto, malloc puede señalar que la memoria está fuera de servicio al devolver 0 y que puede llamar a un manejador; estas no son señales ideales, pero sería mejor que nada. Sin embargo, un problema es que realmente quiero saber cuándo se está agotando la memoria física, por lo que puedo evitar profundizar en el intercambio y hacer que todo se detenga por completo; Supongo que no hay forma de preguntar "¿tenemos que cambiar aún?" o decirle al sistema operativo "no intercambie en mi cuenta, simplemente falle mis solicitudes si se trata de eso"?
Otro enfoque sería averiguar cuánta RAM hay en la máquina y controlar cuánta memoria está usando el programa en este momento. Hasta donde yo sé, generalmente no hay forma de decir lo primero. También me da la impresión de que no hay una manera confiable de decir esto último excepto envolviendo malloc/free con una función de contador (que luego es más problemática en C++).
¿Hay algún enfoque que me falta?
Lo ideal sería una solución portátil, pero sospecho que eso no va a suceder. De lo contrario, una solución que funcione en Windows y otra que funcione en Unix sería agradable. De lo contrario, podría salir adelante con una solución que funciona en Windows y otra que funciona en Linux.
Bueno, todo lo que puedo decir con certeza es que no encontrará una solución portátil. Ah, y que esta no es la tarea más fácil. – sbi
en Linux: http://linux.die.net/man/2/getrusage quizás? En Windows: ¿GetProcessMemoryInfo quizás? –