¿Cuáles son mis opciones para minimizar la huella de memoria en los programas C en Linux (* nix)?Minimizando la huella de memoria en los programas C
Por lo que sé, libc malloc() está utilizando ya sea brk() o mmap(). La memoria asignada con brk() generalmente no se puede devolver debido a la fragmentación de la memoria.
Mi programa debería funcionar 24/7 y tiene una gran cantidad de malloc() - s y free() - s. Después de comenzar, RSS sube a aproximadamente 100Mb. Es demasiado, porque sé con certeza que en cualquier momento particular hay menos de 100 Mb de datos en la memoria.
Probablemente es un problema de fragmentación brk().
¿Cuáles son mis opciones aquí?
¿Debo usar otra implementación de malloc(), que solo usa mmap()? ¿Debo hacer algo más? ¿Hay algo que pueda leer sobre el problema de la huella de memoria?
Gracias.
Usar 'mmap()' para cada asignación no solo sería lento, sino que probablemente incrementaría el uso de memoria, ya que cada asignación se redondea al tamaño de una página de memoria (al menos 4k en la mayoría de las plataformas). – alanc
Básicamente, si tiene muchos allocs idénticos, marque su propio libreto de referencias y preasigne una tonelada de bloques.Aquí puedes encontrar un buen libre de cerradura; http://www.liblfds.org (declinación de interés: soy el autor). Acabo de hacer un punto de referencia de ese libre-freelist contra un libre-libre del mutex; ¡es 10 veces más rápido en un núcleo, 100 veces más rápido en dos! –
Gracias. Definitivamente no está goteando. Investigaré más a fondo. –