2012-10-25 120 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)); 
    } 
}