Protobuf 地图不断为 arena 分配新元素

Posted

技术标签:

【中文标题】Protobuf 地图不断为 arena 分配新元素【英文标题】:Protobuf map keeps allocating new elements to arena 【发布时间】:2020-02-03 05:17:34 【问题描述】:

我有定期更新 protobuf 映射值的代码。为清楚起见,此代码已简化。

void my_periodically_called_function() 
    my_protobuf_map->Clear();
    MyObject obj;
    obj.set_value(data);
    my_protobuf_map['my_key'] = obj;

发生的情况是程序内存在每次迭代中都在不断增长。在挖掘了 protobuf 的 map.h 之后,似乎在清除地图并重新添加元素之后,[] 只会为竞技场分配更多数据(而不清除任何旧数据),这显然是不可取的。

解决此问题的最适合 protobuf 的方法是什么?我想要一种能够从竞技场中删除特定记忆的好方法。

解决问题的一种简单方法是删除 Clear(),但我想保留它以避免旧状态持续存在的奇怪错误。

提前致谢。

【问题讨论】:

【参考方案1】:

protobuf C++ 库实现 arena 分配的方式,没有办法释放单个内存。而是通过释放整个竞技场一次性释放所有这些。

arena 分配器的主要目的是通过使分配成为一个恒定时间的操作来提高速度(它只是增加一个指针)。

在您的情况下,听起来您要么想要定期释放竞技场并重建消息,要么使用处理释放内存的堆分配器。

【讨论】:

以上是关于Protobuf 地图不断为 arena 分配新元素的主要内容,如果未能解决你的问题,请参考以下文章

golang新特性arena,带你起飞

fatal error: google/protobuf/arena.h:没有那个文件或目录

leveldb源码分析之内存池Arena

python 内存分析

LevelDB源码阅读Arena

LevelDB源码阅读Arena