Performance 方案:数据序列化、高效[和功能]

Performance 方案:数据序列化、高效[和功能],performance,serialization,functional-programming,scheme,racket,Performance,Serialization,Functional Programming,Scheme,Racket,我正在序列化数据,这些数据可能是一个整数,一个对象(列表)和其他嵌套对象,并试图选择使用哪种方法。其中,第一种是递归地创建字节向量,并在调用函数中将它们复制到更大的单个字节向量;第二个是使用某种我可以写入的流。最终,尽管有选择,我将能够在任何可能发生的进一步处理中使用生成的二进制数组,例如。G我会压缩输出数据并通过网络发送,或者只是将部分数据写入文件 我希望在实现快速序列化程序的同时保持足够的功能性(或完全的功能性)。我正在使用,不过任何其他方案实现也可以 多谢各位 更新: 以下是我在找到解决方

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

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

多谢各位

更新:

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

写入字节
写入字节
在需要写入八位字节时特别有用

> (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)

可能我正在寻找的是
开放字节向量输出端口

#lang scheme

(require rnrs/bytevectors-6)
(require rnrs/io/ports-6)

(define-values (oup ext-proc) (open-bytevector-output-port))
(write 4 oup)
(write 2 oup)
(ext-proc)
(make-bytevector 3 1)
结果:

Добро пожаловать в DrScheme, версия 4.2.5 [3m].
Язык: scheme; memory limit: 128 MB.
#"42"
#"\1\1\1"
> 

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

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

这不会像二进制表示法那样紧凑——但如果您打算压缩输出,这并不重要。

将输出转换为字节,朋友们通常会创建一个输出端口并调用某个进程[将该端口作为其一个参数]。但是,如果我使用您的方法,我希望能够像在当前实现中一样,将任何其他参数传递给我的自定义proc(proc
write any
)。不,输出到字节的
需要一个thunk——一个没有参数的函数。至于参数,Scheme有词法作用域,这个函数可以使用任何绑定的名称。我想如果我这样做,我的函数将不再是一个组合子,因为它将依赖于未绑定在其主体中的变量,但这些变量绑定在后者之外。(a)这有什么错?(b) 请注意,如果使用严格的组合符,您所能做的很少——即使
+
是从词法环境中获得的。(在方案中,
lambda
是相同的。)