Utilice free
y malloc
. Esto NO provocará problemas de fragmentación.
Las distribuidoras modernas son bastante resistentes a la fragmentación de la memoria. En estos días, se necesita un programa bastante patológico para causar problemas de fragmentación. La fragmentación fue un problema más grave cuando nuestros programas trataban directamente la memoria RAM física, pero con la memoria virtual, un gran "agujero" en el montón de un programa no necesita consumir ningún recurso.
Además, debido al tamaño de los almacenamientos intermedios, la mayoría de los asignadores solicitará una región dedicada del kernel para cada almacenamiento intermedio. En Linux/OS X/BSD, esto significa un mmap
anónimo detrás de las escenas para cada buffer. Esto puede causar la fragmentación del espacio de direcciones, pero el espacio de direcciones virtuales es básicamente gratuito en un sistema de 64 bits, y unos pocos cientos de megas tampoco son un problema en 32 bits.
Así que use free
y malloc
.
Alternativa: Puede que le resulte más rápido hacer que cada memoria intermedia sea más grande de lo que necesita. La forma en que malloc
funciona en un Unix moderno, cualquier página que no se escriba no consume memoria.
Si tiene malloc
un buffer de 500 MB pero solo usa los primeros 100 MB, su programa no usa más memoria que si tiene malloc
un buffer de 100 MB y use todo. Obtiene más fragmentación del espacio de direcciones de esta manera, pero eso no es un problema en los sistemas de 64 bits, y siempre puede ajustar el tamaño de asignación para que también funcione en sistemas de 32 bits.
En cuanto a la sugerencia de utilizar mmap
, basta pensar en malloc
/free
como una interfaz más sencilla a mmap
/munmap
, que es lo que es para grandes asignaciones (1 MiB es un umbral común).
"reservar memoria de antemano crea otros problemas" ¿Entonces un asignador de agrupamiento no es adecuado? ¿Y desea mantenerse estándar o está buscando enfoques para un esquema de asignación personalizado? – Corbin
@ Corbin No creo que los pools sean buenos en mi caso: Linux tiene una política de primer toque en NUMA domanis. Me gustaría quedarme con la solución * portable * – Anycorn
de cualquier forma de administrar los datos en los buffers de modo que pueda evitar el cambio de tamaño? o incluso poner un límite superior en el tamaño del búfer? ¿Cuánta memoria planeas tener en el hardware? –