c++中的内存映射二进制日志
Memory mapped binary logging in C++
我需要获取一个结构体并将其转储到一个文件中以供以后使用。它需要越快越好
在尝试了各种解决方案后,我得出的结论是,memcpy()
到内存映射(具有巨大的页面)文件是解决问题的最快解决方案。有没有更好的方法?
我已经尝试过异步日志,但它)最多和同步内存映射解决方案一样快2.)有额外线程的额外开销(我对资源也有限制:)
下面是一个使用Boost的示例。进程间:
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <fstream>
#include <string>
namespace ip = boost::interprocess;
struct example {
int data;
// etc.
};
const char * filename = "/path/to/file";
int main () {
// Remove existing mapping
ip::file_mapping::remove (filename);
// Create file
std::filebuf fb;
fb.open(filename, std::ios_base::in | std::ios_base::out
| std::ios_base::trunc | std::ios_base::binary);
fb.pubseekoff (sizeof (example)-1, std::ios_base::beg);
fb.sputc (0);
// Map to file
ip::file_mapping mapping (filename, ip::read_write);
// map a region
ip::mapped_region region (mapping, ip::read_write);
// Get mapped address
void *addr = region.get_address( );
// copy struct to file
example ex;
memcpy (addr, &ex, sizeof (example));
// flush to disk
region.flush ();
}
要获取数据,请以相同的方式映射到文件(尽管可能只有只读访问)。这里可能会杀死您的是磁盘刷新,这可能需要一段时间。
理想情况下,您应该尝试映射文件版本和Tanzer's Answer中的简单iostream版本。在您的目标平台上测量两者的性能,并选择最佳的一个。
您可以使用ifstream和ofstream类将您的对象以二进制形式写入文件。
struct anyobj;
ofstream ofs("file.bin",ios::binary);
ofs.write ((char*) & anyobj , sizeof(anyobj));
然后读
struct anyobj2;
ifstream ifs ("file.bin", ios::binary);
ifs.read((char*) & anyobj2 , sizeof(anyobj2));
但是您应该注意不同的系统(可移植性)和编译器(不同的填充策略)等情况。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 有根的二进制搜索树.保留与其父级的链接
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么二进制搜索在我的测试中不起作用
- 重载==不适用于二进制树
- 正在尝试重载二进制搜索树分配运算符
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 带有数组键C++的二进制映射
- C++ 中混合二进制/文本日志记录的最佳做法
- sd_journal_send发送二进制数据.如何使用日志检索数据?
- c++中的内存映射二进制日志