boost :: serialization alto consumo de memória durante a serialização


Assim como o tópico sugere, me deparei com um pequeno problema com o boost :: serialization ao serializar uma enorme quantidade de dados em um arquivo. O problema consiste no espaço ocupado pela memória da parte de serialização do aplicativo, levando de 3 a 3,5 vezes a memória dos meus objetos sendo serializados.
É importante observar que a estrutura de dados que tenho é um vetor tridimensional de ponteiros de classe base e um ponteiro para essa estrutura. Como isso:

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

Mais tarde, isso é serializado com um código analógico para este:

ar & BOOST_SERIALIZATION_NVP(data);

boost / serialization / vector.hpp está incluído.

As classes sendo serializadas são herdadas de "MyBase".
Agora, desde o início do meu projeto, usei arquivos diferentes para serialização, de arquivamento binário típico, texto, xml e, finalmente, binário polimórfico / xml / text. Cada um deles age exatamente da mesma maneira.

Normalmente, isso não seria um problema se eu tivesse que serializar pequenas quantidades de dados, mas o número de classes que tenho são em milhões (idealmente em torno de 10 milhões) e o uso de memória, como pude testá-lo, mostra consistentemente que a memória alocada pela parte boost :: serialization do código é de cerca de 2/3 da área total da memória do aplicativo durante a gravação do arquivo.

Isso equivale a cerca de 13,5 GB de RAM para 4 milhões de objetos, onde os próprios objetos levam 4,2 GB. Agora, isso é o máximo que pude levar em meu código, pois não tenho acesso a uma máquina com mais de 8 GB de RAM física. Devo também observar que este é um aplicativo de 64 bits que está sendo executado em uma edição x64 profissional do Windows 7, mas a situação é semelhante em uma caixa do Ubuntu.

Alguém tem alguma idéia de como eu resolveria isso, pois é inaceitável que eu tenha requisitos de memória tão altos para um aplicativo que não use tanta memória durante a execução quanto na serialização.

A desserialização não é tão ruim, pois aloca cerca de 1,5 vezes a memória necessária. Isso é algo que eu poderia viver.

Tentei desativar o rastreamento com boost :: archive :: archive_flags :: no_tracking, mas ele age exatamente da mesma maneira.

Alguém tem alguma idéia do que devo fazer?

questionAnswers(1)

yourAnswerToTheQuestion