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,帧类型,宽度/高度等) ),时间记录和相机频道.对于您来说,存储空间对于您正在进行的工作来说是便宜的,而您的时间非常宝贵.所以,尽可能多地抓住你想要的东西.您基本上是在实现自己的文件系统,以满足您的需求.通用文件系统提供的需求与其他领域需要的需求不同.
| 归档时间: |
|
| 查看次数: |
11078 次 |
| 最近记录: |