同时写入内存和磁盘

时间:2012-10-25 16:42:19

标签: c++ c memory

我正在开发一个应用程序,需要在内存中保留一段时间 t 数据(可配置),并在磁盘上的持久存储中保留另一个 t2 数据。这背后的原因是,频繁询问的数据将被存储在内存中并更快地检索,而较旧的,较不常见的用户数据将被存储并可在磁盘上检索。

问题是:我不能简单地写入内存,然后在 t 之后将内存缓冲区的全部内容复制到磁盘,就像应用程序崩溃一样,最新数据存储在内存中会迷路。因此,每次收到新数据时,我都需要将其同时存储在内存和磁盘上。

我的问题是,是否有一种有效的方法将内存中的缓冲区镜像到磁盘的一部分?我正在寻找一种比在每次数据更新时写入内存然后写入磁盘更有效的方法。

3 个答案:

答案 0 :(得分:5)

你可以对文件进行内存映射,unix和windows系统都支持这个(但使用不同的API)。之后,您只需写入该内存位置,并在需要时进行同步。

答案 1 :(得分:2)

Boost Memory-Mapped Files

  

类mapped_file_source,mapped_file_sink和mapped_file提供对 Windows POSIX 系统

上的内存映射文件的访问权限

LIVE DEMO

#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/range/istream_range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/irange.hpp>
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>

using namespace std;
using namespace boost;
using namespace boost::iostreams;

int main()
{
    string filename("test.mmap");
    { // Prepare file
        ofstream f(filename);
        copy(irange(0,255), ostreambuf_iterator<char>(f));
    }
    { // Work with memory mapped file
        mapped_file mm(filename);
        fill(mm, 0); // Works as range
        char *data=mm.data(); // Or as raw memory pointer
        copy("String in memory", data); // Copy to raw memory
    }
    { // print file contents
        ifstream f(filename);
        copy(istream_range<char>(f), ostream_iterator<char>(cout));
    }
}

答案 2 :(得分:1)

最好的方法是首先写入内存然后写入磁盘。如果内存已满,请在写入内存之前删除最少使用的项目。

另一种技术是使用单独的执行线程将新项目写入磁盘。该线程将被唤醒,检查新项目并将其写入磁盘。这些项目将被标记为“不是新的”。线程然后回去睡觉。睡眠持续时间应该足够长,以便内存中有多条记录,但足够快,因此在断电或崩溃期间将丢失更少的记录。