我有一个高度格式化的文件,包含大量数据,我经常使用它,所以我将它存储到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;
但每次我可能只需要部分地图,就像某个键值对一样。所以我想知道我是否可以从文件中部分地反序列化映射并只检索我指定的对?这样我就不必将整个文件读入内存。
答案 0 :(得分:1)
您可以创建数据索引,但在压缩存在的情况下使用它会有点困难。如果您的数据文件是未压缩的,并且说每条记录都在一行上,那么您可以创建一个索引,在该索引中存储固定宽度记录中每行的连续偏移量,比如无符号的64位数字
要找到第5112行,您需要打开索引,搜索5112 * 8
,然后阅读两个uint64_t
,例如a
和b
。然后打开数据文件,寻找a
并读取b - a
字节,这是您的记录。
如果数据已压缩,则必须查看压缩库,看看它是否允许您仅部分解压缩包含字节[a, b)
的文件区域。