在OCaml中写入和读取内存映射文件

4

我正在尝试使用OCaml实验,看看如何将数字数组读/写到内存映射文件中。

我认为我需要使用Bigarray,但不确定如何将Bigarray数组写入内存映射文件,然后再读回来?

我似乎找不到任何例子。我已经检查了Jane St. core的源代码,但没有结果。


4
map_file 是一个函数,它可以将一个文件映射到内存中的 bigarray 数组中。映射后,对数组的任何访问都会被重定向到文件中相应的位置。这个函数需要三个参数:文件描述符、文件的偏移量(从文件开头算起)、以及要创建的 bigarray 的类型和尺寸。 - Jonathan Protzenko
@Jonathan-Protzenko:把这个变成答案,它看起来很棒。 - Jeffrey Scofield
2个回答

5

因为你似乎有兴趣使用core:

这里是他们文档中的map_file函数(https://ocaml.janestreet.com/ocaml-core/109.58.00/doc/core/#Bigstring)

val map_file : shared:bool -> Unix.file_descr -> int -> t

map_file共享fd,n个内存映射将与描述符fd关联的数据的n个字符映射到一个bigstring。如果shared为true,则对bigstring所做的所有更改都将反映在文件中。

但是,您应该接受Jonathan创建的答案。


4
我正在将这个作为答案(最初我担心我没有理解你的意思)。OCaml库默认提供了一种机制,即来自Bigarray.Genarray模块的map_file函数。它恰好可以实现你想要的效果,并相当于在Unix下使用mmap映射文件。我不确定Windows的具体情况。
这样做的优点是得到了良好的支持和测试,同时如果你之前没有需要的话,也不需要导入JaneSt's Core到你的项目中。

顺便提一下,通常将stdlib和核心代码混合使用是安全的吗? - user2991422
只要你不使用异步,它应该是安全的。许多核心模块都是相应标准库模块的包装器。如果需要使用它,请查看核心中的“Caml”模块,它将整个stdlib进行了封装。 - rgrinberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接