附加到内存映射文件

Joe*_*ont 22 c++ boost mmap

我不断附加股票报价(整数,多头,双打等).我用mmap将此文件映射到内存中.

将新附加数据作为内存映射的一部分提供的最有效方法是什么?

我知道我可以再次打开文件(新文件描述符),然后mmap它来获取新数据,但这似乎是低效的.我建议的另一种方法是以1mb块预先分配文件,写入特定位置直到到达结尾然后将文件ftruncate为+ 1mb.

还有其他方法吗?

Doest Boost对此有何帮助?

Fre*_*Foo 22

Boost.IOStreams只有固定大小的内存映射文件,所以它对你的具体问题没有帮助.Linux有一个接口mremap,其工作方式如下:

void *new_mapping = mremap(mapping, size, size + GROWTH, MREMAP_MAYMOVE);
if (new_mapping == MAP_FAILED)
    // handle error
mapping = new_mapping;
Run Code Online (Sandbox Code Playgroud)

然而,这是不可携带的(并且记录不完整).Mac OS X似乎没有mremap.

在任何情况下,你不需要重新打开文件,只是munmap它和mmap它再次:

void *append(int fd, char const *data, size_t nbytes, void *map, size_t &len)
{
    // TODO: check for errors here!
    ssize_t written = write(fd, data, nbytes);
    munmap(map, len);
    len += written;
    return mmap(NULL, len, PROT_READ, 0, fd, 0);
}
Run Code Online (Sandbox Code Playgroud)

预分配方案在这里可能非常有用.确保跟踪文件的实际长度并在关闭之前再次截断它.


小智 16

我知道答案已经被接受了,但如果我提供答案,也许会帮助别人.提前分配一个大文件,比如说大小为10 GiB.提前创建其中三个文件,我称之为卷.跟踪您在标题,其他文件等位置的最后已知位置,然后从该点继续追加.如果达到文件的最大大小并且没用房间,请切换到下一个卷.如果没有更多卷,请创建另一个卷.请注意,您可能会提前几卷,以确保不会阻止您的附加等待创建新卷.这就是我们在DVR系统中用于存储连续传入视频/音频以进行监视的方法.我们不会浪费空间来存储视频剪辑的文件名,这就是为什么我们不使用真正的文件系统,而是我们去平面文件,我们只是跟踪偏移,帧信息(fps,帧类型,宽度/高度等) ),时间记录和相机频道.对于您来说,存储空间对于您正在进行的工作来说是便宜的,而您的时间非常宝贵.所以,尽可能多地抓住你想要的东西.您基本上是在实现自己的文件系统,以满足您的需求.通用文件系统提供的需求与其他领域需要的需求不同.