boost :: serialización alto consumo de memoria durante la serialización


tal como lo sugiere el tema, he encontrado un pequeño problema con boost :: serialization al serializar una gran cantidad de datos en un archivo. El problema consiste en que la huella de memoria de la parte de serialización de la aplicación toma alrededor de 3 a 3.5 veces la memoria de mis objetos que se serializan.
Es importante tener en cuenta que la estructura de datos que tengo es un vector tridimensional de punteros de clase base y un puntero a esa estructura. Me gusta esto:

using namespace std;    
vector<vector<vector<MyBase*> > >* data;

Esto luego se serializa con un código análogo a este:

ar & BOOST_SERIALIZATION_NVP(data);

boost / serialization / vector.hpp está incluido.

Todas las clases que se serializan heredan de "MyBase".
Ahora, desde el comienzo de mi proyecto, he usado diferentes archivos para la serialización desde el típico archivo binario, texto, xml y finalmente binario polimórfico / xml / texto. Cada uno de estos actúa exactamente de la misma manera.

Por lo general, esto no sería un problema si tuviera que serializar pequeñas cantidades de datos, pero la cantidad de clases que tengo son de millones (idealmente alrededor de 10 millones) y el uso de memoria, como he podido probar, muestra consistentemente que la memoria asignada por boost :: la parte de serialización del código es alrededor de 2/3 de la huella de memoria completa de la aplicación al escribir el archivo.

Esto equivale a alrededor de 13.5 GB de RAM tomados para 4 millones de objetos donde los objetos mismos toman 4.2GB. Ahora, esto es lo más lejos que he podido llevar mi código, ya que no tengo acceso a una máquina con más de 8 GB de RAM física. También debo tener en cuenta que esta es una aplicación de 64 bits que se ejecuta en una edición profesional x64 de Windows 7, pero la situación es similar en un cuadro de Ubuntu.

Cualquiera tiene idea de cómo solucionaría esto, ya que es inaceptable que tenga requisitos de memoria tan altos para una aplicación que no utilizará tanta memoria mientras se ejecuta como la serialización.

La deserialización no es tan mala, ya que asigna alrededor de 1,5 veces la memoria necesaria. Esto es algo con lo que podría vivir.

Intenté desactivar el seguimiento con boost :: archive :: archive_flags :: no_tracking pero actúa exactamente igual.

Alguien tiene alguna idea de lo que debo hacer?

Respuestas a la pregunta(1)

Su respuesta a la pregunta