如何将Cap'n Proto用于应用程序的可变状态,类似于Protobuf的使用方式?有垃圾收集器吗?
Kenton Varda在his comparison of Cap'n Proto, FlatBuffers, and SBE确认Cap'n Proto在内部使用竞技场分配器来发送消息。如果一条消息在一段延长的时间内编辑,就会因为被写入磁盘并重新加载而无限制地增长。
Cap'n Proto是否有任何垃圾收集器重新安排消息并收回任何浪费的空间?垃圾收集器会是最佳方法吗?如果没有,或者如果不存在,那么推荐的方法是什么?
我实际上正在写一个Rust程序,它必须只保存加密数据。因此,我可以重新复制整个消息结构,但我对更广泛的选项感到好奇。
答案 0 :(得分:3)
回收浪费空间的唯一方法是将消息复制到新的MessageBuilder中。只有"使用"零件将被复制。这实际上是" GC" - 许多最好的GC算法实际上都在移动数据,这就是你在这里做的事情。
没有切实可行的方法来实现竞技场分配Cap' n Proto消息的非移动GC。
我正在考虑在C ++中扩展Cap的原型代码生成器,以生成一组适合在堆上表示相同数据结构的类,以便您可以随时修改结构。当然,在堆表示和竞技场表示之间转换将需要一个副本。但是,这还没有实施,我没有任何时间表。 (Rust实现可能会得到类似的更新。)