1

我在 github 项目 prevayler-clj 上打开了这个问题

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

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

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

4

2 回答 2

1

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

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

有关 clojure 向量内部的一些见解,请参阅这些页面:

于 2015-08-07T13:41:03.237 回答
1

Prevayler 显然ObjectOutputStream为每个序列化元素重新开始,防止它们之间重用类数据。另一方面,您的测试代码是以“自然”方式编写的,允许重用。我不清楚是什么迫使 Prevayler 每次都重新启动,但考虑到它具有的负面影响,我会犹豫将其称为“功能”;“解决方法”是更可能的名称。

于 2015-08-08T08:11:57.890 回答