【发布时间】:2019-03-29 08:37:20
【问题描述】:
我想通过网络发送一个非常大(~8GB)的数据结构,所以我使用 Marshal 模块将其转换为字节。
我的问题是内存加倍,因为我们需要存储两种表示形式(初始数据和编组数据)。
有没有一种简单的方法来编组到流中?这将避免获得初始数据结构的完整编组表示。
我想过编组到一个 out_channel,在其中我打开一个带有第二个线程的管道并从主线程中的管道读取到 s Stream,但我想可能有一个更简单的解决方案。
谢谢!
编辑:回复评论:
在顶层:
let a = Array.make (1024*1024*1024) 0. ;; (* Takes 8GB of RAM *)
let data = Marshal.to_bytes a [Marshal.Closures] ;; (* Takes an extra 8GB *)
【问题讨论】:
-
你能告诉我们你的代码吗?您如何与网络通信?
-
流是什么意思?
-
@ivg : 标准库的 Stream 模块:caml.inria.fr/pub/docs/manual-ocaml/libref/Stream.html
-
@PatJ :当你在顶层创建一个 8GB 的数组时,你可以看到它占用了 8GB 的常驻内存。仍然在顶层,如果您对其进行编组,您可以看到您使用了 16BG 的常驻内存。
-
正如@PatJ 所要求的那样,了解您如何写入网络确实可能会有所帮助。也许您可以作为频道直接流式传输到网络中。
标签: stream ocaml marshalling