0

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

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

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

4

3 回答 3

5

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

于 2012-10-25T16:44:11.560 回答
2

提升内存映射文件

mapped_file_source、mapped_file_sink 和 mapped_file 类提供对WindowsPOSIX系统上的内存映射文件的访问

现场演示

#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));
    }
}
于 2012-10-25T17:28:41.057 回答
1

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

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

于 2012-10-25T17:15:07.243 回答