1

この問題を github プロジェクト prevayler-clj でオープンしました

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

この のような 1M の短いベクトル[:a1 1]が prevayler の状態を形成するため、Java writeObject を使用して 1 つずつシリアル化すると、1 GB のファイル サイズになります。

出来ますか?PersistentVector ごとに約 1kB? さらに調査した結果、同じ量のベクターを 80MB のファイルでシリアル化できることが示されました。では、プリベイラーの連載で何が問題になっているのでしょうか。これらのテストで何か間違ったことをしていますか?テスト コードの抜粋については、github の問題を参照してください。

4

2 に答える 2

1

Prevayler は明らかObjectOutputStreamに、シリアル化された各要素に対して新たに開始し、要素間のクラス データの再利用を防ぎます。一方、テスト コードは「自然な」方法で記述されているため、再利用が可能です。Prevayler を毎回再起動させる理由は明確ではありませんが、負の影響があることを考えると、これを「機能」と呼ぶのは躊躇します。「回避策」は、より可能性の高い指定です。

于 2015-08-08T08:11:57.890 に答える
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 に答える