C++ 如何通过C+执行std::map的部分反序列化+;boost::序列化

C++ 如何通过C+执行std::map的部分反序列化+;boost::序列化,c++,serialization,boost,C++,Serialization,Boost,我有一个包含大量数据的高格式文件,我经常使用它,所以我将其存储到std::map中,并使用boost::serialization库对其进行序列化。序列化代码如下所示: boost::iostreams::filtering_ostream ofs {}; ofs.push (boost::iostreams::zlib_compressor ()); ofs.push (boost::iostreams::file_sink (file_name)); boost::archive::bina

我有一个包含大量数据的高格式文件,我经常使用它,所以我将其存储到std::map中,并使用boost::serialization库对其进行序列化。序列化代码如下所示:

boost::iostreams::filtering_ostream ofs {};
ofs.push (boost::iostreams::zlib_compressor ());
ofs.push (boost::iostreams::file_sink (file_name));
boost::archive::binary_oarchive oa {ofs};
oa << my_map;
boost::iostreams::filtering_ostream of s{};
ofs.push(boost::iostreams::zlib_compressor());
ofs.push(boost::iostreams::file_sink(file_name));
boost::archive::binary_oarchive oa{ofs};

oa您可以为您的数据建立索引,尽管在存在压缩的情况下使用该索引有点困难。如果数据文件未压缩,并且假设每条记录都在一行上,则可以创建一个索引,在该索引中,将每行的连续偏移量存储在固定宽度的记录中,例如无符号的64位数字

要定位第5112行,您需要打开索引,查找
5112*8
,然后读取两个
uint64\t
s,比如
a
b
。然后打开数据文件,查找
a
并读取
b-a
字节,这是您的记录


如果数据被压缩,您必须查看压缩库,看看它是否允许您仅部分解压缩包含字节的文件区域
[a,b)

谢谢你的回复Kerrek。非常有用!不幸的是,以固定宽度模式存储数据是不切实际的。我想我必须将每个数据的大小存储在gzip的头中。然后我必须定义自己的压缩器来过滤\u流…这超出了我的能力。以及“压缩”您提到的方法也要求我这样做:-(如果我错了,请纠正我!谢谢你的回答!@bowhan:说清楚,你的数据不是固定宽度的,而是索引。你必须建立索引一次,这很慢,但之后你基本上可以随机访问你的记录。@Kerrer:我明白你的意思了!很抱歉我的误解。但我仍然不知道怎么做这个索引是因为map的键有顺序。例如,我想检索key1的值,但我不知道key1的索引在索引文件中的位置,除非我创建一个index的索引。所以我认为文本索引文件会更直接。实际上,通过随机访问,我感觉失去了map序列化的感觉。我可以创建一个原始数据的随机访问文件,每次都阅读我想要的内容而不构建地图?如果我有任何错误,请纠正我!谢谢!