写入记忆和同时磁盘
Writing to memory and to disk simultaneously
我正在开发一个应用程序,该应用程序需要在内存中保留一定时间 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));
}
}
最好的方法是首先写入内存,然后到磁盘。如果内存已满,请在写入内存之前删除使用最少的项目。
另一种技术是具有单独的执行线,将新项目写入磁盘。线程将醒来,检查新项目并将其写入磁盘。这些项目将被标记为"不是新"。然后该线程回去睡觉。睡眠持续时间应该足够长,以使记忆中有多个记录,但是足够快,因此在电源关闭或崩溃时会丢失较少的记录。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 递归函数有效,但无法记忆
- 如何将记忆应用于此递归函数?
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 矢量和其他容器如何在磁盘上工作?
- 共享记忆:让我们谈谈它的特殊性
- 如何从整个磁盘中排除要装载的一个文件
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 如何将 IPropertyBag 保存到磁盘
- 防止临时对象文件访问 MSVC 中的磁盘
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 关于记忆后这种递归关系的时间复杂度
- 记忆栅栏和记忆屏障是一样的吗
- 使用记忆在 C++ 中实现 Knapstack
- 即使使用 FILE_FLAG_DELETE_ON_CLOSE 属性创建文件,文件也会保留在磁盘上
- Linux 源代码中普通磁盘文件的"轮询"功能在哪里实现?
- 写入记忆和同时磁盘