Ocaml 如何使用Bigarray.map_文件写入新文件

Ocaml 如何使用Bigarray.map_文件写入新文件,ocaml,Ocaml,我想用Bigarray.map_文件创建一个新文件,如下所示: let file_write_ba path = try let fd = Unix.openfile path ~mode:[Unix.O_WRONLY;Unix.O_CREAT] in let ba = Bigarray.array1_of_genarray (Unix.map_file fd ~pos:0L Bigarray.char Bigarray.c_la

我想用Bigarray.map_文件创建一个新文件,如下所示:

let file_write_ba path =
    try
        let fd = Unix.openfile path ~mode:[Unix.O_WRONLY;Unix.O_CREAT] in
        let ba = Bigarray.array1_of_genarray (Unix.map_file fd 
            ~pos:0L Bigarray.char Bigarray.c_layout true [|(-1)|])
        in
        Some ba
    with
    | _ -> Printf.printf "some error"; None

let write_chunk ~inba ~outba ~inpos ~outpos ~size =
    let sub_in = Bigarray.Array1.sub inba inpos size in
    let sub_out = Bigarray.Array1.sub outba outpos size in
    Bigarray.Array1.blit sub_in sub_out

let do_write databa =
    let outba = file_write_ba "some_temp_file" in
    write_chunk databa outba 0 0 (Bigarray.Array1.dim databa)

因此,它无法创建sub_out,但我不知道如何解决在map_文件上扩展bigarray的问题。

要提到三件事:

  • mmap()将不会更改文件大小。您创建了一个大小为0的文件,因此它始终保持大小为0,并且不会向该文件写入任何内容。在调用mmap()之前,您必须通过向文件写入数据或调用fallocate(不确定ocaml是否有映射)来调整文件大小

  • 使用mmap()编写文件效率极低。当blitting双字节时,写入每个页面的第一个字节会导致页面错误。然后内核从文件系统读取相应的数据块,并重试写操作。然后写操作会更改页面中的字节。在稍后的某个时间,内核将页面写回文件

  • 错误处理几乎是不可能的。mmaped文件上的写入错误将在稍后的某个随机时间发生,并且无法捕获它们


  • 那么,你打算怎么办?将4Gb Bigarray保存到新文件的最简单方法是什么?使用extlinux中的Bigarray写入函数。