0

应该如何将 Cap'n Proto 用于应用程序的可变状态,类似于如何使用 Protobuf?有垃圾收集器吗?

Kenton Varda 在比较 Cap'n Proto、FlatBuffers 和 SBE 时证实,Cap'n Proto 在内部使用竞技场分配器来处理消息。如果一个人在很长一段时间内编辑它,例如由于被写入磁盘并重新加载,一条消息将无限制地增长。

Cap'n Proto 是否有任何垃圾收集器来重新排列消息并回收任何浪费的空间?垃圾收集器会是最佳方法吗?如果没有,或者不存在,那么推荐的方法是什么?

我实际上正在编写一个 Rust 程序,无论如何它只能保存加密数据。因此,我可以重新复制整个消息结构,但我对更广泛的选项感到好奇。

4

1 回答 1

4

回收浪费空间的唯一方法是将消息复制到新的 MessageBuilder 中。只会复制“使用过的”部分。这实际上就是“GC”——许多最好的 GC 算法实际上会移动数据,这就是你在这里要做的。

没有实用的方法来实现 arena-allocated Cap'n Proto 消息的不动 GC。

我正在考虑在 C++ 中扩展 Cap'n Proto 代码生成器,以生成一组适合表示堆上相同数据结构的类,以便您可以随着时间的推移修改结构。当然,堆表示和竞技场表示之间的转换需要一个副本。但是,这还没有实施,我没有任何时间表。(Rust 实现可能会得到类似的更新。)

于 2015-06-30T17:14:45.947 回答