问题描述
我在github项目prevayler-clj上打开了这个问题
因为1M短向量(例如[:a1 1]
)形成了prevayler的状态,所以使用Java writeObject逐一序列化时会导致文件大小为1GB。
可能吗? 每个PersistentVector大约1kB? 进一步的研究表明,相同数量的向量可以在80MB的文件中序列化。 那么,prevayler序列化出了什么问题? 我在这些测试中做错了吗? 请参阅github问题以获取我的测试代码摘录。
1楼
每个说prevLayer都没错。 只是java的writeObject方法没有完全调整为写入clojure数据。 它旨在存储任何可序列化的Java对象的内部结构。 由于Clojure向量在幕后是相当复杂的java对象,因此我不感到惊讶的是,一个小的向量可能会写出大约Kb的数据。
我猜想几乎任何特定于Clojure的序列化方法都将导致文件更小。
根据经验,标准clojure.core/pr
+ clojure.core/read
在文件大小和速度之间取得良好的平衡,并且可以处理几乎任何大小的数据结构。
请参阅以下页面以了解Clojure载体的内部结构:
2楼
Prevayler显然为每个序列化的元素启动了一个新的ObjectOutputStream
,从而防止了它们之间类数据的任何重用。
另一方面,您的测试代码是以“自然”的方式编写的,允许重复使用。
尚不清楚每次迫使Prevayler重新启动的原因,但鉴于它具有负面影响,我犹豫称其为“功能”。
“解决方法”是更可能的名称。