Java 个序列化 Clojure 数据结构的大小

Size of Java serialized Clojure data structures

我在 github 项目 prevayler-clj

上打开了这个问题

https://github.com/klauswuestefeld/prevayler-clj/issues/1

因为 1M 短向量,像这样 [:a1 1],形成 prevayler 的状态,在序列化时产生 1GB 的文件大小,一个接一个,使用 Java writeObject。

可能吗?每个 PersistentVector 大约 1kB?进一步的调查表明,相同数量的向量可以在一个 80MB 的文件中序列化。那么,prevayler 序列化出了什么问题?我在这些测试中做错了什么吗?我的测试代码摘录请参考 github issue。

prevLayer 没有任何问题。只是 java 的 writeObject 方法并不完全适合写入 clojure 数据;它旨在存储任何可序列化 java 对象的内部结构。由于 clojure 向量在幕后是相当复杂的 java 对象,我对一个小向量可能写出大约 1Kb 的数据并不感到惊讶。

我猜想几乎任何特定于 clojure 的序列化方法都会生成较小的文件。根据经验,标准 clojure.core/pr + clojure.core/read 在文件大小和速度之间取得了良好的平衡,并且可以处理几乎任何大小的数据结构。

请参阅以下页面以深入了解 clojure 向量的内部结构:

Prevayler 显然为每个序列化元素启动一个新的 ObjectOutputStream,以防止在它们之间重复使用 class 数据。另一方面,您的测试代码是以 "natural" 方式编写的,允许重用。我不清楚是什么迫使 Prevayler 每次重新启动,但考虑到它的负面影响,我会犹豫将其称为 "feature"; "workaround" 是更有可能的名称。