美文网首页
基于boost实现c++ map持久化

基于boost实现c++ map持久化

作者: NoStory | 来源:发表于2021-03-09 02:26 被阅读0次

背景

最近处理自然语言相关模块时,遇到模型初始化过慢问题,究其原因是持久化的模型数据需要层层计算才能得到最终内存中需要的数据结构。而模型文件发成变化评率很低,因此考虑对内存数据结构的序列化和反序列化来实现加速。

调研c++相关比较方便的序列化/反序列化的办法主要有Boost和ProtoBuf 2种方案。后者在跨语言传输方面大有作为,但对c++ 标准库的支持较为麻烦,而前者是c++方面成熟的框架,支持包括map在内的std库的持久化。正好模型数据最耗时的一部分在内存中正好是map形式保存,因此直接接入Boost。

过程

cmake 接入boost库

CMakeList.txt

# 增加include
target_include_directories(YOUR_MODULE_NAME PRIVATE /your_boost_path/include)

# 增加库引用
target_link_libraries(YOUR_MODULE_NAME /your_boost_path//lib/libboost_serialization.a)


配置头文件

/**
* part 1: 配置头文件
*/
// 保存为二进制
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

// 保存为XML
//#include <boost/archive/xml_iarchive.hpp>
//#include <boost/archive/xml_oarchive.hpp>

// 保存为纯文本
//#include <boost/archive/text_iarchive.hpp>
//#include <boost/archive/text_oarchive.hpp>

// 要保存什么类型,则需要引用对应的boost头文件
//#include <boost/serialization/list.hpp>
//#include <boost/serialization/vector.hpp>
#include <boost/serialization/map.hpp>

序列化和反序列化方法

/**
* part 2: 序列化和反序列化方法
*/
void save(string path, map<int, map<int, float>> &m) {
    std::ofstream file(path);
    // binary_oarchive 会以二进制形式保存,若要改为xml或text,将头文件和该类型的“binary”直接替换为xml或者text即可
    boost::archive::binary_oarchive oa(file, boost::archive::no_header);
    oa << m;
}

void load(string path, map<int, map<int, float>> &m)
{
    std::ifstream file(path);
    boost::archive::binary_iarchive ia(file, boost::archive::no_header);
    ia >> m;
}

调用示例


/**
* part 3: 调用示例
*/

std::map<int, map<int, float>> m1;
save("1.bin", m1); // 将map保存到文件1.bin

std::map<int, map<int, float>> m2;
load("1.bin", m1); // 从1.bin文件加载map

完整示例

/**
* part 1: 配置头文件
*/
// 保存为二进制
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

// 保存为XML
//#include <boost/archive/xml_iarchive.hpp>
//#include <boost/archive/xml_oarchive.hpp>

// 保存为纯文本
//#include <boost/archive/text_iarchive.hpp>
//#include <boost/archive/text_oarchive.hpp>

// 要保存什么类型,则需要引用对应的boost头文件
//#include <boost/serialization/list.hpp>
//#include <boost/serialization/vector.hpp>
#include <boost/serialization/map.hpp>

/**
* part 2: 序列化和反序列化方法
*/
void save(string path, map<int, map<int, float>> &m) {
    std::ofstream file(path);
    // binary_oarchive 会以二进制形式保存,若要改为xml或text,将头文件和该类型的“binary”直接替换为xml或者text即可
    boost::archive::binary_oarchive oa(file, boost::archive::no_header);
    oa << m;
}

void load(string path, map<int, map<int, float>> &m)
{
    std::ifstream file(path);
    boost::archive::binary_iarchive ia(file, boost::archive::no_header);
    ia >> m;
}

/**
* part 3: 调用示例
*/

std::map<int, map<int, float>> m1;
save("1.bin", m1); // 将map保存到文件1.bin

std::map<int, map<int, float>> m2;
load("1.bin", m1); // 从1.bin文件加载map

相关文章

  • 基于boost实现c++ map持久化

    背景 最近处理自然语言相关模块时,遇到模型初始化过慢问题,究其原因是持久化的模型数据需要层层计算才能得到最终内存中...

  • c++作为模块扩展python

    具体参考这里:基于 Boost 库实现的 Python 调用 C++ 接口 错误1:undefined symbo...

  • HyperLedgerFabric日志系统改造(日志适配器)

    上篇文章从源码角度去修改代码从而实现日志持久化,本次将给基于x-appender这个项目实现fabric日志持久化...

  • 使用websocketpp实现c++ websocket通讯

    1. boost安装 Websocketpp是基于boost::asio开发的一个C++协议库,你的电脑上需要首先...

  • redis

    redis的持久化 在redis中已经提供了两种持久化的方案 RDB: redis提供的一种基于快照机制实现的持久...

  • C++ (boost) 单元测试

    C++ (boost) 单元测试 C++ boost 单元测试 [TOC] 基本概念 Boost test库提供了...

  • Boost库

    Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。 Boost库...

  • C++与Python混合编程:Boost.python的安装与使

    Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。Boost库由...

  • STL源码解析(1)-红黑树

    STL源码解析(1)-红黑树 STL容器之红黑树实现 C++中map和set都是基于红黑树的实现, 其迭代器也是红...

  • C++大厂面试真题

    C++标准库的map和set有什么区别,如何实现的? map和set都是C++的关联容器,其底层实现都是红黑树。 ...

网友评论

      本文标题:基于boost实现c++ map持久化

      本文链接:https://www.haomeiwen.com/subject/juhvqltx.html