Memory 具有公共元素的大型数据结构的高效内存序列化

Memory 具有公共元素的大型数据结构的高效内存序列化,memory,serialization,ocaml,Memory,Serialization,Ocaml,假设数据结构如下所示: type data = A of a_struct | B and a_struct = { s : string ; cross : data list ; down : data list } 其中交叉元素基本上是由向下元素组成的树的副本。使用yojson序列化这样一个树的大型实例(~250MB)会因为内存使用量(几GB)而破坏我的系统。这可能是因为json不知道如何共享树中的多个副本。我认为S表达式也是如此 是否有办法以更接近OCaml内部表示的格式进行序列化

假设数据结构如下所示:

type data = A of a_struct | B 

and a_struct = { s : string ; cross : data list ; down : data list }
其中交叉元素基本上是由向下元素组成的树的副本。使用yojson序列化这样一个树的大型实例(~250MB)会因为内存使用量(几GB)而破坏我的系统。这可能是因为json不知道如何共享树中的多个副本。我认为S表达式也是如此

是否有办法以更接近OCaml内部表示的格式进行序列化,或者我必须自己压缩数据?

默认情况下,模块保留共享。(您可以使用标志将其关闭。)

Core的空间效率很高,但不支持共享。据我所知,只有
Marshal
模块支持共享,但它不是很稳定,因为它可以根据不同版本的编译器更改格式。如果这对你来说无关紧要,那么这可能是一个不错的选择