Boost 二进制存档 - 减小大小

2023-12-02

我正在尝试减少 C++ 中 boost 档案的内存大小。

我发现的一个问题是,Boost 的二进制存档默认对任何 int 使用 4 个字节,无论其大小如何。因此,我发现空的 boost 二进制存档需要 62 个字节,而空的文本存档需要 40 个字节(空文本存档的文本表示形式:22 serialization::archive 14 0 0 1 0 0 0 0 0).

有什么方法可以改变整数的默认行为吗?

另外,除了对向量使用 make_array 之外,还有其他方法可以优化二进制存档的大小吗?


  1. Q. 我正在尝试减少 C++ 中 boost 档案的内存大小。

    See Boost C++ 序列化开销

  2. Q. 我发现的一个问题是,Boost 的二进制存档默认对任何 int 使用 4 个字节,无论其大小如何。

    那是因为它是序列化库,而不是压缩库

  3. Q. 因此,我发现空的 boost 二进制存档需要 62 个字节,而空的文本存档需要 40 个字节(空文本存档的文本表示形式:22 serialization::archive 14 0 0 1 0 0 0 0 0)。

    使用存档标志:例如从Boost序列化:如何预测序列化结果的大小?:

    • 调整内容(boost::archive::no_codecvt、boost::archive::no_header、禁用跟踪 etc.)
  4. Q. 有什么方法可以改变整数的默认行为吗?

    没有。有BOOST_IS_BITWISE_SERIALIZABLE(T)虽然(参见例如提高序列化按位序列化能力示例和解释)。

  5. Q. 另外,除了使用之外,还有其他方法来优化二进制存档的大小吗make_array对于向量?

    Using make_array没有帮助vector<int>:

    Live On Coliru

    #include <boost/archive/binary_oarchive.hpp>
    #include <boost/serialization/vector.hpp>
    #include <sstream>
    #include <iostream>
    
    static auto const flags = boost::archive::no_header | boost::archive::no_tracking;
    
    template <typename T>
    std::string direct(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v;
        }
        return oss.str();
    }
    
    template <typename T>
    std::string as_pod_array(T const& v) {
        std::ostringstream oss;
        {
            boost::archive::binary_oarchive oa(oss, flags);
            oa << v.size() << boost::serialization::make_array(v.data(), v.size());
        }
        return oss.str();
    }
    
    int main() {
        std::vector<int> i(100);
        std::cout << "direct: "       << direct(i).size() << "\n";
        std::cout << "as_pod_array: " << as_pod_array(i).size() << "\n";
    }
    

    Prints

    direct: 408
    as_pod_array: 408
    

压缩

最直接的优化方法是压缩结果流(另请参阅添加的基准here).

除此之外,您将必须覆盖默认序列化并应用您自己的压缩(可以是简单的游程编码、霍夫曼编码或更特定于域的编码)。

Demo

Live On Coliru

#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <sstream>
#include <iostream>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/copy.hpp>

static auto const flags = boost::archive::no_header | boost::archive::no_tracking;

template <typename T>
size_t archive_size(T const& v)
{
    std::stringstream ss;
    {
        boost::archive::binary_oarchive oa(ss, flags);
        oa << v;
    }

    std::vector<char> compressed;
    {
        boost::iostreams::filtering_ostream fos;
        fos.push(boost::iostreams::bzip2_compressor());
        fos.push(boost::iostreams::back_inserter(compressed));

        boost::iostreams::copy(ss, fos);
    }

    return compressed.size();
}

int main() {
    std::vector<int> i(100);
    std::cout << "bzip2: " << archive_size(i) << "\n";
}

Prints

bzip2: 47

压缩率约为 11%(如果删除存档标志,压缩率约为 19%)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boost 二进制存档 - 减小大小 的相关文章

  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我

随机推荐

  • (BYTE)-1 是什么意思

    我正在阅读别人的代码 define CPUTYPE INVALID BYTE 1 这意味着什么 我想它具有与以下相同的效果 define CPUTYPE INVALID 255 如果我们已经有 typedef unsigned char B
  • 在 ASP.NET 中,内联表达式是在后面的代码之前还是之后执行?

    Do ASP 内联表达式 在执行代码隐藏中的代码之前或之后在服务器上运行 内联代码在 asp net 页面生命周期中预渲染页面之后执行 因此 它可以在某些事情之前运行 也可以在某些事情之后运行 在此处阅读页面生命周期 http msdn m
  • 推送到 GitHub 时出错 - 权限不足,无法将对象添加到存储库数据库

    我在尝试对 GitHub 存储库执行 git Push 时遇到异常错误 Counting objects 8 done Delta compression using 2 threads Compressing objects 100 4
  • D3 刷分组条形图

    我试图让刷牙工作与此示例类似 但使用分组条形图 http bl ocks org mbostock 1667367 我对刷牙的工作原理不太了解 我找不到任何好的教程 所以我对出了什么问题有点不知所措 我将尝试在下面包含相关的代码 该图表按天
  • Typescript 无法将对象字面量分配给泛型类型

    如果我尝试将对象文字与具有类型约束的泛型类型一起使用 我会收到类型错误 我正在努力找出原因 type WithKey readonly akey string function listOfThings
  • 通过索引访问 collections.OrderedDict 中的项目

    假设我有以下代码 import collections d collections OrderedDict d foo python d bar spam 有没有办法以编号的方式访问这些项目 例如 d 0 foo s Output d 1
  • 如何在没有 Firebase 的情况下为 React Native 应用程序设置 Google 登录?

    我需要将谷歌登录方法添加到我的反应本机应用程序中 我使用了 react native google signin 包 我也在谷歌控制台中制作了一个项目 但当我尝试登录时出现错误 它给出错误 发生了其他错误 并且它位于我的 signIn 函数
  • 停止播放通过 SoundEffect.FromStream 调用的声音

    我有一些 Windows Phone 7 代码 可以使用 SoundEffect FromStream 开始播放声音 我使用它而不是普通的媒体对象 因为我需要多个音频剪辑位于一页上 但是 根据某些外部事件 我想停止播放特定的声音 由于通过
  • 比较 datetime2 时 SQL 忽略纳秒

    我有 2 张桌子 上面有一个datetime2各场 其中一个表也存储了纳秒 而另一个表最多只存储毫秒 无法更改此数据 现在我想比较这两个表并检查是否datetime2值匹配 但我必须为此忽略纳秒 样本数据 Table1 Table2 201
  • 在 IE 11 中获取未定义的 JavaScript 函数

    在 IE 11 中调用函数时出现一些错误 在我的例子中 一个脚本中有两个脚本
  • 用于比较具有变音符号和非变音变体的字符串的正则表达式

    任何人都可以帮助我使用 JavaScript 正则表达式 我可以使用它来比较相同的字符串 同时考虑到它们的非变音版本 例如 在德语中这个词Gr e也可以写成Gruesse 这两个字符串被认为是相同的 映射 暂时忽略大小写 是 ae ue o
  • Azure流分析如何处理多个输出表?

    我创建了一项 ASA 作业 还创建了 1 个输入别名和 1 个输出别名 像这样 我像这样编辑了查询部分 WITH StreamData AS SELECT employee id first name last name age salar
  • SQL Server 2005 中使用 CTE 的递归查询

    好的 这就是我想做的 我在 MSSQL2005 中使用 CTE 查询 查询的目标是通过产品类别的父子关系进行递归 并返回每个类别下的产品数量 这包括子类别中包含的所有产品 我当前的版本仅返回所显示类别的产品数量 它没有考虑其任何子项中可能包
  • 无法使用简单注入器注册 Api 控制器?

    我有一个使用 Simple Injector 的 WebApi 它工作得很好 但我必须在项目中实现 OAuth 现在我已经做到了 我的 ApiControllers 给了我一个错误 比如 Simple Injector 现在已经正确设置 我
  • 什么是 Zend 框架“资源”?

    我知道这个问题很愚蠢 我经常在文档中看到这个术语 但我仍然没有从我遇到的这样的上下文中得到启发 资源 和 图书馆 有什么区别 在我的假设中 我得出的结论是它们只是一组加载的类 我想确认一下我的说法是否正确 但我不明白为什么他们在 Zend
  • JEdi​​torPane 和自定义编辑器套件

    我有一个小问题 我需要将现有文件加载到JEditorPane使用自定义编辑器套件 我有一个编辑器工具包 一个带有某些扩展名的文件 我需要强制JEditorPane识别我的文件并使用我的编辑器套件 我只发现 这是可能的 但无处可去 该套件也基
  • UITextField 中的填充

    是否可以在 UITextField 内设置填充 如果可以的话如何设置 我也想知道 你在这里 UIView paddingView new UIView new CGRect 0 0 5 20 YourTextField LeftView p
  • 在Java中递归反转字符串的最佳方法是什么?

    今天我一直在搞递归 通常是一种未充分使用的编程技术 我开始递归地反转一个字符串 这是我想出的 A method to reverse a string using recursion public String reverseString
  • 发送属性作为 mixin 的参数

    我想分解所有媒体查询并将 CSS 属性作为参数传递 bp1 css media max width 959px css bp1 width 186px 不幸的是 这不起作用并导致 Less 失败 从Less v1 7 0开始 可以通过分离的
  • Boost 二进制存档 - 减小大小

    我正在尝试减少 C 中 boost 档案的内存大小 我发现的一个问题是 Boost 的二进制存档默认对任何 int 使用 4 个字节 无论其大小如何 因此 我发现空的 boost 二进制存档需要 62 个字节 而空的文本存档需要 40 个字