2

我有一个高度格式化的文件,其中包含我经常使用的大量数据,因此我将其存储到 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;

但每次我可能只需要地图的一部分,比如某个键值对。所以我想知道我是否可以从文件中部分反序列化地图并只检索我指定的对?这样我就不必将整个文件读入内存。

4

1 回答 1

1

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

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

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

于 2012-06-23T18:22:47.993 回答