Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 高效地将字符串复制到mmap';定位_Ocaml_Mmap - Fatal编程技术网

Ocaml 高效地将字符串复制到mmap';定位

Ocaml 高效地将字符串复制到mmap';定位,ocaml,mmap,Ocaml,Mmap,我希望尽可能高效地将字符串从OCaml程序复制到mmap指定的内存区域(通过Genarray.file\u map获取)。我的目标是在OCaml进程运行时允许其他进程从这个共享内存中读取数据,并且开销最小(我不需要完全并发特性,只有一个写入程序和一个读取程序) 我尝试按字符复制字符,如下面的代码段(其中复制字符串s的前255个字符): 但这是非常低效的:即使输入量相对较小,执行时间也比不使用mmap要长3倍 有更好的方法吗?理想情况下,我希望避免太多依赖项,例如Jane Street的核心Big

我希望尽可能高效地将字符串从OCaml程序复制到
mmap
指定的内存区域(通过
Genarray.file\u map
获取)。我的目标是在OCaml进程运行时允许其他进程从这个共享内存中读取数据,并且开销最小(我不需要完全并发特性,只有一个写入程序和一个读取程序)

我尝试按字符复制字符,如下面的代码段(其中复制字符串
s
的前255个字符):

但这是非常低效的:即使输入量相对较小,执行时间也比不使用
mmap
要长3倍


有更好的方法吗?理想情况下,我希望避免太多依赖项,例如Jane Street的
核心

Bigarray模块只在Bigarray之间提供
blit
。如果额外的开销确实是由于mmapped内存的行为造成的,那么可以尝试先将字符串复制到bigarray,然后将blit从bigarray复制到mmapped目标。(要从mmapped数组中读取,可以执行相反的操作。)


我唯一能想到的另一件事是用C语言对传输进行编码(使用
memcpy()
)并将它们作为外部函数调用。

感谢您的建议,尽管使用
blit
没有太大变化
memcpy
工作得更好,但对我来说还是太慢了。原程序运行时间为0.6s;使用
Genarray.Bigarray
,需要2.1秒。使用C绑定执行
mmap
memcpy
,它是1.4s。因此,这里没有太多的工作要做,我想.cstruct有一些有效的函数用于在字符串/BigArray之间进行复制:
let fd = Unix.openfile "/tmp/foo" [Unix.O_RDWR; Unix.O_CREAT] 0o600 in
let mmap = Bigarray.Genarray.map_file fd Bigarray.Char Bigarray.C_layout true
    (Array.of_list [256])
in
let n = min (String.length s - 1) 255 in
for i = 0 to n do
  Bigarray.Genarray.set mmap [|i|] (String.get s i)
done;
Bigarray.Genarray.set mmap [|n|] (Char.chr 0)