gpt4 book ai didi

serialization - 如何在 SBCL/Common Lisp 中序列化和加载对象

转载 作者:行者123 更新时间:2023-12-04 05:56:00 25 4
gpt4 key购买 nike

我有一个对象 o,它是 SBCL 中类 X 的一个实例。

我想要一个函数 write-X-object 将 o 序列化到一个文件中,这样当该文件用 load-X-object 读回时,生成的对象等效于 o。

;; 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 GB 的大小(或由数百万个较小对象组成的数组),具有复杂的结构,因此我们的想法是尽可能快地读取和写入。

最佳答案

有三种主要方法可以做到这一点

  • 使用内置的打印/读取工具:您可以在 print-object 上定义一个方法对于将序列化它的类(也许您会让它依赖于某些特殊变量,因此您不会将千兆字节打印到 repl)。然后你可以定义一个阅读器宏(对应于你用来打印对象的任何语法)然后保存你的对象,你会做(with-open-file (x "/tmp/foo" :direction :output) (print my-object X))要取回它,你会做 (with-open-file (x "/tmp/foo") (read x) .优点是这很简单。缺点是这很慢并且不节省空间。
  • 您可以利用评论者建议的第三方序列化库,例如 conspack。优点:读写速度相当快。缺点:您不能增量读取大于内存的对象。
  • 您可以重组您的类(使用 MOP),以便对象可以以完全相同的格式存储在内存和磁盘上,然后使用 mmap 读取/写入它。这方面的一个示例库是 manardb。该系统还允许存储许多不同的对象。优点:没有读写磁盘的开销。可以自动处理大于主内存的对象(is 为您处理换入/换出 ram)。缺点:访问对象字段的开销可能很小。请注意,使用这种方法,通常可以通过使用可以通过 ffi 指针正确优化访问的实现以及使用专门的数据结构(例如浮点数组比通用数组好得多)来避免大多数缺点
  • 关于serialization - 如何在 SBCL/Common Lisp 中序列化和加载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555363/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com