boost::serialization 序列化期间内存消耗较高

2024-05-05


正如主题所示,在将大量数据序列化到文件时,我遇到了 boost::serialization 的一个小问题。问题在于应用程序序列化部分的内存占用量大约是要序列化的对象内存的 3 到 3.5 倍。
值得注意的是,我拥有的数据结构是基类指针和指向该结构的指针的三维向量。像这样:

using namespace std;    
vector<vector<vector<MyBase*> > >* data;

稍后使用与此类似的代码对其进行序列化:

ar & BOOST_SERIALIZATION_NVP(data);

包括 boost/serialization/vector.hpp。

被序列化的类全部继承自“MyBase”。
现在,自从我的项目开始以来,我使用了不同的档案进行序列化,从典型的binary_archive、文本、xml 到最后的多态二进制/xml/文本。其中每一个的行为方式都完全相同。

通常,如果我必须序列化少量数据,那么这不会成为问题,但我拥有的类数量为数百万(理想情况下约为 1000 万),并且我能够测试的内存使用情况始终表明写入文件时,代码的 boost::serialization 部分分配的内存大约占应用程序整个内存占用量的 2/3。

这相当于 400 万个对象占用约 13.5 GB 的 RAM,其中对象本身占用 4.2 GB。现在这就是我所能获取的代码,因为我无法访问具有超过 8GB 物理 RAM 的机器。我还应该注意到,这是一个在 Windows 7 专业版 x64 版本上运行的 64 位应用程序,但在 Ubuntu 机器上情况类似。

任何人都知道我将如何解决此问题,因为对于我来说,对于一个应用程序有如此高的内存要求,而该应用程序在运行时不会像序列化时那样使用那么多内存,这是不可接受的。

反序列化并没有那么糟糕,因为它分配的内存大约是所需内存的 1.5 倍。这是我可以忍受的。

尝试使用 boost::archive::archive_flags::no_tracking 关闭跟踪,但其行为完全相同。

有人知道我应该做什么吗?


使用 valgrind 我发现内存消耗的主要原因是库内用于跟踪指针的映射。如果您确定不需要指针跟踪(这意味着您确定没有指针别名),请禁用跟踪。你可以找到here http://www.boost.org/doc/libs/1_35_0/libs/serialization/doc/traits.html#tracking禁用跟踪的主要概念。简而言之,你必须做这样的事情:

BOOST_CLASS_TRACKING(vector<vector<vector<MyBase*> > >, boost::serialization::track_never)

In 我的问题 https://stackoverflow.com/questions/35391792/set-tracking-traits-of-template-class-in-boost-serialization-to-reduce-memory-co我编写了这个宏的一个版本,您可以禁用对模板类的跟踪。这一定会对您的内存消耗产生重大影响。 另请注意,任何容器内都有指针,如果您不想跟踪,则也必须禁用对它们的跟踪。目前我找不到任何方法来正确执行此操作。

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

boost::serialization 序列化期间内存消耗较高 的相关文章

随机推荐

  • Python:如何检索每年的谷歌学术引用?

    我正在尝试从 Google Scholar 个人资料中检索信息 我有url from bs4 import SoupStrainer BeautifulSoup from urllib2 import Request urlopen url
  • 我可以在 Android 上使用带有文本视图的列表视图和图像图标吗

    我需要一个像下面的 Android 应用程序那样的列表视图 由于我无法发布图片 所以应该是这样的 图片在这里 一些自由文本 用户名等 这是你的任务 任务1 gt 任务2 gt 任务 1 和任务 2 是将从数据库动态获取的列表 我试图拥有一个
  • 在Java中运行命令行[重复]

    这个问题在这里已经有答案了 有没有办法在 Java 应用程序中运行此命令行 java jar map jar time rel test txt debug 我可以用命令运行它 但我无法在 Java 中运行它 Runtime rt Runt
  • 将大块位图转换为 3 维位图

    Problem 我需要这个大量的数据作为输入 对于基于C的arduino 这是上面示例中所需格式的大量数据 const byte bitmap 8 8 0xFF 0x81 0x81 0x81 0x81 0x81 0x81 0xFF 0x81
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • SVG 视图框显示屏幕外项目

    我正在使用 HTML5 制作游戏svg标签为图形提供多分辨率显示 游戏的大部分内容已经完成 但在测试中我刚刚遇到了一个主要错误 其中涉及 SVG 对象可见 尽管在非本机分辨率下位于视图框之外 我不确定这是否是我的代码或浏览器本身的缺陷 Go
  • 从 WPF 打印/报告的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在单击片段的按钮时替换该片段?

    我有一个包含多个片段的活动 Activity 最初有片段 其中有两个按钮 单击此按钮后 我必须用新片段替换该片段 每个片段都有各种小部件 并将当前片段替换为各种事件 这是我的问题 我怎样才能实现这个目标 给我建议 您可以用 Fragment
  • 从现有 MongoDB 创建可视化的工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我接手了一个现有 MongoDB 的项目 我想获得现有数据的视觉图像 图表等 显然 MongoDB 与
  • Android USB_DEVICE_ATTACHED 持久权限

    如何让 Android 在每次重新连接 USB 设备时都不再请求权限 我想让它记住 USB 设备的 默认使用 复选标记 这样我就不必每次都向同一设备授予权限 我以编程方式检测 USB 设备 Android 手机 何时连接到我的主机设备 An
  • 如何找到一组值的精确匹配?

    我有一个简单的表来存储师生关系 以显示学生正在上谁的课或老师正在教谁 无论哪种方式 为便于阅读 按老师排序 CREATE TABLE TS RELATIONSHIP Teacher NVARCHAR 10 Student NVARCHAR
  • 求反射角的弧度

    我正在编写一个简单的 Flash 游戏 只是为了学习 Flash 并提高我的数学能力 但我对弧度感到非常困惑 因为这对我来说是新的 到目前为止 我所做的是使用鼠标 单击并释放 使用弧度向该方向射出一个球 现在我想要发生的是 当球撞到墙壁时
  • Node exec 无权执行脚本

    直到最近 它都运行良好 但是当我今天尝试使用它时 它无法正常运行 它返回以下错误 错误 命令失败 bin sh c home pi RPi Computer Power RPi Server routes scripts hash js 1
  • Cordova 3.0,应用程序错误与服务器的连接失败。 (暂停)

    我在尝试加载本地 index html 文件时遇到超时问题 但我不知道如何增加默认的 20 秒超时时间 我见过人们在 droidgap 扩展 onCreate 方法中使用以下几行的帖子 super setIntegerProperty lo
  • 在 Angular 中使用异步管道设置选择元素的选定项目

    角度专家 我试图理解 Angular 中的异步管道 但我陷入了一个基本场景 我在用户界面中有两个选择元素 一个包含帖子 一个包含相关评论 我想将一个帖子 最后一个 设置为显示帖子的选择元素的最初选择的帖子 并且我想使用所选项目来过滤第二个选
  • cmake 找不到 boost 库,因为它查找错误的文件名

    我根据文档在 Windows 8 1 机器上构建了 boost 1 56 库 作为共享库和静态库 他们全部出现在BOOST ROOT stage lib目录 文件名格式如下 boost thread vc120 mt 1 56 dll bo
  • 在 GAE/J 上创建文件并上传到 Google 文档

    是否可以在 GAE J 上创建任何类型的文件并上传到 google 文档 我问过一个类似的问题 https stackoverflow com questions 3996495 uploading a pdf file to google
  • 可与 switch() 一起使用的自定义结构/类型

    我的一个项目有一个值类型 结构 表示视频格式的自定义标识符字符串 在本例中 它将包含内容类型字符串 但这可能会有所不同 我使用了一个结构体 因此它在传递时可以是强类型的 并对初始字符串值执行一些健全性检查 实际的字符串值可以是任何内容并由外
  • 在ReactJS中,如果我们不为useEffect提供依赖数组,是否会导致该函数每次都被调用?

    我看到在ReactJS 文档 https reactjs org docs hooks overview html的依赖数组useEffect fn 是可选的 不提供它应该与提供空数组相同 但是 如果我的代码如下 https codesan
  • boost::serialization 序列化期间内存消耗较高

    正如主题所示 在将大量数据序列化到文件时 我遇到了 boost serialization 的一个小问题 问题在于应用程序序列化部分的内存占用量大约是要序列化的对象内存的 3 到 3 5 倍 值得注意的是 我拥有的数据结构是基类指针和指向该