Estoy trabajando en un algoritmo de clasificación externo que usa std::queue
y debo restringir cuidadosamente su uso de memoria. Me he dado cuenta de que durante la fase de fusión (que usa varios std::queue
s de longitud fija), mi uso de memoria aumenta a aproximadamente 2,5 veces lo que esperaba. Como std::queue
usa por defecto std::deque
como su contenedor subyacente, ejecuté algunas pruebas en std::deque
para determinar su sobrecarga de memoria. Estos son los resultados, que se ejecutan en VC++ 9, en modo de lanzamiento, con un proceso de 64 bits:¿Qué está pasando con la sobrecarga de memoria de std :: deque?
Al agregar 100,000,000 char
a un std::deque
, el uso de la memoria crece a 252,216K. Tenga en cuenta que 100M char
s (1 byte) debe ocupar 97,656K, por lo que esta es una sobrecarga de 154,560K.
Repetí la prueba con double
s (8 bytes) y vi la memoria crecer a 1,976,676K, mientras que 100M double
s deberían ocupar 781,250K, para una sobrecarga de 1,195,426K !!
Ahora entiendo que std::deque
normalmente se implementa como una lista vinculada de "trozos". Si esto es cierto, ¿por qué la sobrecarga es proporcional al tamaño del elemento (porque, por supuesto, el tamaño del puntero debe ser fijo a 8 bytes)? ¿Y por qué es tan grande?
¿Alguien puede arrojar algo de luz sobre por qué std::deque
usa tanta memoria dañada? Estoy pensando en cambiar mis contenedores subyacentes std::queue
a std::vector
ya que no hay sobrecarga (dado que el tamaño apropiado es reserve
ed). Estoy pensando que los beneficios de std::deque
se niegan en gran medida por el hecho de que tiene una sobrecarga tan grande (que provoca fallas de caché, fallas de página, etc.) y que el costo de copiar elementos std::vector
puede ser menor, dado que el total el uso de la memoria es mucho menor. ¿Es solo una mala implementación de std::deque
de Microsoft?
Primera pregunta. ¿Cómo determinaste el uso de la memoria? Como algunos métodos no son tan precisos como otros. –
@Martin, solo estoy observando el valor del "Conjunto de trabajo máximo" para el proceso en el Administrador de tareas. – Tabber33
Si escribe un programa para asignar 2M de datos (en fragmentos) y luego lo libera todo, espere a que el usuario ingrese antes de salir muestra el mismo comportamiento. es decir, las rampas de memoria se estabilizan pero no bajan. PD> No puedo encontrar "Peak Working Set" –