performance - 方案:数据序列化,高效[和功能]

标签 performance serialization functional-programming scheme racket

我正在序列化数据,它可能是一个整数、一个包含其他嵌套对象的对象(列表),并尝试选择要使用的方法。在两个中,第一个是递归地创建字节向量,并将它们在调用函数中复制到更大的单个字节向量;第二个是使用某种我可以写入的流。最终,尽管有选择,我还是能够在可能发生的任何进一步处理中使用生成的二进制数组,例如。 G。我会压缩输出数据并通过网络发送它,或者只是将它的某些部分写入一个文件。

我希望在实现快速序列化程序的同时保持足够(或完全)的功能。我正在使用 Racket ,尽管任何其他 Scheme 实现也可以。

谢谢。

更新:

以下是我找到解决方案后添加的示例,以便用户节省一些时间来寻找如何写入数据的方式:]

write-bytewrite-bytes 在您需要写入八位字节时特别有用。

> (bytes? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector->u8-list (with-output-to-bytes (lambda () (write-byte 42))))
{42}
> (bytes->list (with-output-to-bytes (lambda () (write-byte 42) (write-bytes (integer->integer-bytes #x101CA75 4 #f #t)))))
(42 1 1 202 117)

最佳答案

您可以只使用write 将数据写入端口。您可以对所有值执行此操作,作为包含所有内容的列表。如果您遇到循环数据之类的问题,则可能需要稍作调整,其中将 print-graph 设置为 #t 可以很好地处理它。如果您希望输出为字节字符串,则可以使用 open-output-bytes,或方便的 with-output-to-bytes 函数:

(with-output-to-bytes (lambda () (write (list value1 value2 value3))))

这不会像二进制表示那样紧凑——但如果您打算无论如何都压缩输出,那也没关系。

关于performance - 方案:数据序列化,高效[和功能],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353087/

相关文章:

javascript - D3拖动事件触发的频率是多少?

c# - LINQ 链接中的 Any() 运算符

c++ - 消息包,C++ : How to use MSGPACK_DEFINE with c++11 enum classes

performance - 让 Oracle 9i 使用索引

python - XX 处的 Django 序列化程序 ManyRelatedManager 对象不是 JSON 可序列化的

c - 在 C 中使用动态数组和 gsl_vector 写入和读取结构体

haskell - 学习 Haskell 等纯函数式语言背后的理论的引用资料?

recursion - 使用fold_left/right反转OCaml中的列表

haskell - 将带有循环的 C 函数转换为 Haskell

c# - 使用(新变量或声明新变量)给出参数在内存使用方面有区别吗?