2012-10-25 70 views
0

我正在开发需要保持一定时间的数据牛逼存储器(可配置)的应用程序和其他时间T2价值的数据在磁盘上的持久性存储。这样做的原因是,经常询问的数据将被存储在内存中,并被更快地检索,而较旧的,不太常见的用户数据将被存储和检索到磁盘上。写入内存和磁盘同时

的问题是:我不能简单地写入到内存中,然后时间牛逼后内存中buffer to disk的全部内容复制为如果应用程序崩溃,内存中存储的最新的数据将会丢失。所以每次接收到新数据时,我都需要将它同时存储在内存和磁盘上。

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

+5

的mmap()应该是你的朋友,我相信:http://en.wikipedia.org/wiki/Mmap这适用于POSIX系统(例如Linux和Mac)。如果你在Windows上,MapViewOfFile应该提供类似的功能:http://msdn.microsoft.com /en-us/library/aa366761.aspx –

+0

@Nikos Chantziaras:如果我在amiga上怎么办? – megazord

+0

您是否担心应用程序崩溃(操作系统缓冲区仍然有效)或计算机崩溃? –

回答

5

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

1

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

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

2

Boost Memory-Mapped Files

的类mapped_file_source,mapped_file_sink和mapped_file所提供的WindowsPOSIX访问内存映射文件系统

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