在boost序列化中设置模板类的跟踪特性以减少内存消耗

时间:2016-02-14 12:33:35

标签: c++ boost boost-serialization memory-profiling

正如此link所述,用于定义模板类的特征,我们应该手动定义它,或者从特征类中提取我们的类。但是我想自动制作这个过程,因为这个原因受到BOOST_CLASS_TRACKING的启发我编写了打击代码:

define FOO_CLASS_TRACKING(E, PARAMETER_TUPLE, ...)           \
  namespace boost {                                             \
  namespace serialization {                                     \
  template<BOOST_PP_TUPLE_ENUM(PARAMETER_TUPLE)>                \
  struct tracking_level< __VA_ARGS__ >                          \
  {                                                             \
    typedef mpl::integral_c_tag tag;                            \
    typedef mpl::int_< E> type;                                 \
    BOOST_STATIC_CONSTANT(                                      \
                          int,                                  \
                          value = tracking_level::type::value   \
                                             );                 \
    /* tracking for a class  */                                 \
    BOOST_STATIC_ASSERT((                                       \
                         mpl::greater<                          \
                         /* that is a prmitive */               \
                         implementation_level< __VA_ARGS__ >,   \
                         mpl::int_<primitive_type>              \
                         >::value                               \
                                             ));                \
  };                                                            \
  }}

// which used like this
FOO_CLASS_TRACKING(boost::serialization::track_never, (typename Key, typename Value), Foo<Key, Value>)

我在我的代码中使用了这个宏,但现在我不确定这个宏是否会阻止类跟踪。 我有一个大数据结构,我想在序列化过程中消耗更少的内存。通过使用callgrind检查我的程序,我发现序列化lib中的大多数new()调用来自文件save_pointer中名为basic_oarchive.hpp的函数,该函数存储指向跟踪对象的指针映射,我希望通过将所有类更改为never_track内存消耗显着降低。但没有发生重大变化。

我的宏有问题吗?或序列化的内存消耗与跟踪对象无关? 有没有办法发现是否设置了类的跟踪特性?

修改

我的项目简介是一个特里,每个节点都是一个抽象类的指针,并有指向其子节点的指针。如果我不禁用指针跟踪,那么所有这些节点都会保存在boost序列化库的映射中,并且在序列化期间内存会乘以2。

更新

我放在这里的宏效果很好。但是对于禁用跟踪,您必须注意到库有许多内部指针跟踪它们。例如,在我的情况下,有许多指向pair<const Key, Value>的指针,它是许多stl或其他容器的内部指针。通过禁用所有这些内存消耗显着降低。

1 个答案:

答案 0 :(得分:1)

更新

OP已经posted the synthetic benchmark确实展示了他想要衡量的东西。

我在Massif下运行了两次:在左边只是构建一个大树,在右边也是序列化它:https://gist.github.com/sehe/5f060a3daccfdff3178c#file-sbs-txt

enter image description here

  

请注意内存使用情况基本上完全相同:对象跟踪不是问题

为了进行比较,启用跟踪时:https://gist.github.com/8d3e5dba7b124a750b9b

enter image description here

结论

  

问。 我在代码中使用了这个宏,但现在我不确定这个宏是否会阻止该类跟踪。

是。它显然是。

旧答案的原始脚注:

¹不,它通常不会是内存量的两倍 - 这需要一种非常特定的数据集,具有非常低的有效负载 - 节点大小比率

相关问题