2016-09-18 4 views
1

私はオブジェクトoを持っていますが、これはSBCLのクラスXのインスタンスです。SBCL/Common Lispでオブジェクトを直列化してロードする方法

私は、そのファイルをload-X-objectで読み込んだときに結果として得られるオブジェクトがoと等価であるように、oをファイルにシリアライズする関数write-X-objectを必要とします。

;; writing the object 
(write-X-object o "~/tmp/o.serialized") 

;; reading the object, much later, 
;; after sbcl has been exited and restarted 

(setq v (read-X-object "~/tmp/o.serialized")) 

oは複雑な構造で、サイズはギガバイト(以下数百万のオブジェクトの配列)についてのかもしれませんので、アイデアは、読書のためのものであり、可能な限り迅速であることを書きます。

+1

https://github.com/conspack/cl-conspack – PuercoPop

答えて

2

印刷の施設に建てられたこの

  1. 利用を行うための3つの主要な方法があります/読み:あなたはそれをシリアライズでしょう、あなたのクラスのためのprint-objectのメソッドを定義することができます(おそらくあなたは、それが依存していますいくつかの特別な変数は、あなたがreplにギガバイトを印刷しないようにします)。次に、あなたがオブジェクトを保存するために使用する構文に対応するリーダーマクロを定義して、(with-open-file (x "/tmp/foo" :direction :output) (print my-object X))というオブジェクトを保存し、それを元に戻すには(with-open-file (x "/tmp/foo") (read x)を使用します。プロは、これは簡単だということです。問題は、これは遅く、スペース効率が悪いということです。
  2. コメント者から提案されたconspackのようなサードパーティのシリアライズライブラリを利用することができます。長所:読み書きが合理的に速い。短所:メモリよりも大きなオブジェクトを徐々に読み取ることはできません。
  3. オブジェクトをメモリとディスクに正確に同じフォーマットで保存し、mmapを使って読み書きすることができるように、クラスを再構成することができます(MOPを使用)。これのためのライブラリの例はmanardbです。このシステムはまた、多くの異なるオブジェクトを格納することを可能にする。長所:ディスクへの読み書きのオーバーヘッドはありません。メインメモリよりも大きなオブジェクトを自動的に処理することができます(これは、RAMのスワップアウト/スムーズな処理です)。短所:オブジェクトのフィールドにアクセスするためのオーバーヘッドが小さい場合があります。この方法では、ffiポインタによるアクセスを適切に最適化できる特殊なデータ構造(例えば、一般的な配列よりもはるかに優れた浮動小数点配列)を使用することで、大部分の問題を回避できることに注意してください。
+0

ありがとうございます。ちょうど明確にするために、私はいくつかの理由からオプション1を避けようとしています。それは遅いですし、スペースが効率的でなく、コード作成が面倒です。私はオプション2を調べます。 – kdog

関連する問題