当前位置: 代码迷 >> java >> Java序列化Clojure数据结构的大小
  详细解决方案

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

热度:89   发布时间:2023-07-25 19:29:44.0

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

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

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

每个说prevLayer都没错。 只是java的writeObject方法没有完全调整为写入clojure数据。 它旨在存储任何可序列化的Java对象的内部结构。 由于Clojure向量在幕后是相当复杂的java对象,因此我不感到惊讶的是,一个小的向量可能会写出大约Kb的数据。

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

请参阅以下页面以了解Clojure载体的内部结构:

Prevayler显然为每个序列化的元素启动了一个新的ObjectOutputStream ,从而防止了它们之间类数据的任何重用。 另一方面,您的测试代码是以“自然”的方式编写的,允许重复使用。 尚不清楚每次迫使Prevayler重新启动的原因,但鉴于它具有负面影响,我犹豫称其为“功能”。 “解决方法”是更可能的名称。

  相关解决方案