写入记忆和同时磁盘

Writing to memory and to disk simultaneously

本文关键字:磁盘 记忆      更新时间:2023-10-16

我正在开发一个应用程序,该应用程序需要在内存中保留一定时间 t 在内存中(可配置)和另一个时间 t2 磁盘上持续存储中的数据价值。之后的原因是,常见数据将存储在内存中并更快地检索,而较旧的,较少的用户数据将在磁盘上存储和检索。

问题是:我不能简单地写入存储会迷路。因此,每次收到新数据时,我都需要同时存储在内存和磁盘上。

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

您可以记忆映射文件,UNIX和Windows系统支持此文件(但使用不同的API)。之后,您可以简单地写入该内存位置,并在需要时进行同步。

增强内存映射文件

类mapped_file_source,mapped_file_sink和mapped_file在 Windows> Windows posix Systems

上提供对内存映射文件的访问

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));
    }
}

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

另一种技术是具有单独的执行线,将新项目写入磁盘。线程将醒来,检查新项目并将其写入磁盘。这些项目将被标记为"不是新"。然后该线程回去睡觉。睡眠持续时间应该足够长,以使记忆中有多个记录,但是足够快,因此在电源关闭或崩溃时会丢失较少的记录。