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は、WindowsおよびPOSIXシステム上のメモリマップファイルへのアクセスを提供します

ライブデモ

#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

最善の方法は、最初にメモリに書き込み、次にディスクに書き込むことです。メモリがいっぱいの場合は、メモリに書き込む前に、使用頻度の低い項目を削除してください。

もう 1 つの手法は、新しい項目をディスクに書き込む別の実行スレッドを用意することです。スレッドが起動し、新しい項目をチェックしてディスクに書き込みます。アイテムは「新品ではありません」とマークされます。その後、スレッドはスリープ状態に戻ります。スリープ期間は、複数のレコードがメモリに保存されるように十分に長くする必要がありますが、電源オフまたはクラッシュ時に失われるレコードが少なくなるように十分に高速である必要があります。

于 2012-10-25T17:15:07.243 に答える