Голосование за «хороший» макрос для шаблонных классов (ну, это макрос; я до сих пор всегда использовал частичную специализацию)


е, как предполагается в теме, я столкнулся с небольшой проблемой с boost :: serialization при сериализации огромного количества данных в файл. Проблема состоит в том, что объем памяти части приложения, используемой для сериализации, занимает от 3 до 3,5 раз больше памяти, чем мои объекты, которые сериализуются.
Важно отметить, что имеющаяся у меня структура данных - это трехмерный вектор указателей базового класса и указатель на эту структуру. Нравится:

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

Это позже сериализуется с кодом, аналогичным этому:

ar & BOOST_SERIALIZATION_NVP(data);

boost / serialization / vector.hpp включен.

Все сериализуемые классы наследуются от «MyBase».
Теперь, с момента запуска моего проекта, я использовал различные архивы для сериализации из типичного двоичного_архива, текста, xml и, наконец, полиморфного двоичного файла / xml / text. Каждый из них действует точно так же.

Как правило, это не было бы проблемой, если бы мне пришлось сериализовать небольшие объемы данных, но количество классов, которые у меня есть, исчисляется миллионами (в идеале около 10 миллионов), а использование памяти, как я смог протестировать, показывает, что память, выделенная частью кода boost :: serialization, составляет около 2/3 всей памяти приложения при записи файла.

Это составляет около 13,5 ГБ ОЗУ для 4 миллионов объектов, а сами объекты занимают 4,2 ГБ. Теперь я могу взять свой код, поскольку у меня нет доступа к машине с более чем 8 ГБ физической памяти. Я также должен отметить, что это 64-битное приложение, работающее в 64-разрядной версии Windows 7 professional, но на Ubuntu такая же ситуация.

Любой знает, как мне решить эту проблему, поскольку для меня неприемлемо предъявлять такие высокие требования к памяти для приложения, которое не будет использовать столько памяти при работе, сколько при сериализации.

Десериализация не так плоха, так как она выделяет примерно в 1,5 раза больше необходимой памяти. Это то, с чем я мог бы жить.

Попытался отключить отслеживание с помощью boost :: archive :: archive_flags :: no_tracking, но он действует точно так же.

Кто-нибудь знает, что мне делать?

Ответы на вопрос(0)

Ваш ответ на вопрос