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

时间:2015-08-07 12:44:09

标签: java serialization clojure prevayler

我在github项目prevayler-clj

上打开了这个问题

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

因为形成prevayler状态的1M短向量(如此[:a1 1])在使用Java writeObject逐个序列化时会导致1GB文件大小。

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

2 个答案:

答案 0 :(得分:1)

每个人说prevLayer没有错。只是java的writeObject方法并没有完全适合编写clojure数据;它旨在存储任何可序列化java对象的内部结构。由于clojure向量是相当复杂的Java对象,我不会非常惊讶于一个小向量可能写出大约是一个Kb的数据。

我猜这几乎任何特定于clojure的序列化方法都会导致文件变小。根据经验,标准clojure.core/read + $(document).ready(function () { // After loading of select element, select option which has value as current web page's URL $('select.news-filters-select').val($('select.news-filters-select option[value="'+location+'"]').val()); }); 在文件大小和速度之间取得了良好的平衡,并处理了几乎任何规模的数据结构。

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

答案 1 :(得分:1)

Prevayler显然为每个序列化元素启动了一个新的ObjectOutputStream,防止在它们之间重用类数据。另一方面,你的测试代码是用#34; natural"方式,允许重用。什么迫使Prevayler每次重启都不清楚,但我会毫不犹豫地将其称为“特征”,因为它具有负面影响; "替代方法"是更有可能的名称。