高性能C++内存映射库mio使用心得

news/2024/11/28 14:28:34/文章来源:https://www.cnblogs.com/carsonzhu/p/18574227

背景

在C++编程中,高效的数据访问至关重要,而内存映射文件(Memory Mapped Files)提供了一种强大的工具,它允许我们直接将文件内容加载到进程地址空间,从而以极高的效率进行读写操作。今天,我们要向大家推荐一个轻量级且易于使用的开源库——mio。

项目介绍

mio是一个头文件式的、跨平台的C++11内存映射库,采用MIT许可协议。它的设计目标是便于任何C++项目集成,无需依赖Boost库。这个库不仅提供了基本的内存映射功能,还考虑到了灵活性和性能优化,使得开发者可以更轻松地处理大文件或需要高速数据交换的场景。(地址:https://github.com/vimpunk/mio)

mio的核心特性在于其简洁的API设计。创建内存映射对象有三种方式:构造函数、工厂函数以及map成员函数。对于已经打开的文件描述符,可以直接建立映射,避免了Boost.Iostreams中的限制。此外,mio提供了两种不同语义的映射类:一种是只移动的mmap_source,适用于零成本抽象;另一种是类似std::shared_ptr的shared_mmap_source,支持共享。

在Windows平台上,mio也支持宽字符类型,增加了对Unicode文件名的支持。库内部管理了页面边界对齐,用户无需关心具体的系统页面大小,提升了易用性。

mio非常适合于以下场景

  • 高速日志记录与回放,由于内存映射文件的操作直接作用于磁盘,减少了磁盘I/O次数。
  • 大数据处理,如地图渲染、科学计算等,通过内存映射直接处理大文件,节省了反复读取的时间。
  • 数据存储和检索服务,比如数据库实现,利用内存映射提高数据存取速度。
  • 实时数据分析,当需要快速处理大量文件并实时反馈结果时,内存映射提供了有效手段。

项目特点

  • 无依赖:mio是一个独立的库,不需要额外安装其他依赖,方便集成。
  • 易用性:API设计简洁,提供多种创建映射的方法,适应不同的需求。
  • 灵活性:支持从已打开的文件描述符创建映射,并处理任意偏移和长度,提高了灵活性。
  • 性能优化:自动处理页面边界对齐,减少错误的可能性,提升效率。
  • 跨平台:可在Linux、macOS和Windows等多个操作系统上运行。
  • 单头文件:提供单个头文件版本,简化项目的引入。
  • CMake支持:提供CMake构建系统,方便测试和安装。

 

应用案例分析

我们在客户端软件服务器算法通信的交互架构中引入 ramdisk 技术,一方面是为了提高客户端和服务器相互传输文件的读写速度,另一方面是为了引入共享内存的技术,进而可以让多个进程或者线程使用 Mmap 技术来实现更高效的读写。

Ramdisk或者共享内存技术可以让文件内容以 文件的形式存储在内存中。

那么如果算法进程想读取什么内容到自己的内存进程空间中,通常有几种做法:

  1. 在进程的栈空间分配对应的空间 (std::vector<uint16>)来进行数据的存储。利用 memcpy 等方式进行数据的拷贝。
  2. 在堆空间进行空间分配然后进行数据的拷贝(tmalloc)等方式。

无论是其中的那种形式,都涉及到空间的分配或者数据的拷贝,这两个步骤都是需要时间的。

上述两种方案的正常应用场景主要是用于从磁盘中进行数据加载,目的是为了将常用的数据加载到内存中,便于之后的高速数据处理。

但是raw data 已经存在于内存中,对于程序来说是可以做到高速的寻址和处理,那么也无需在进程的堆空间或者栈空间中进行数据的重复分配和拷贝。

面对这种场景,可以采用Mmap技术,只需要在进程空间对 raw data进行一个映射,不涉及到内容的拷贝。可以简单理解为就是分配一个指针来指向内存空间的 raw data。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842870.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

destoon8.0开启根据时间归档

destoon8.0开启根据时间归档,代码如下:<?php define(DT_REWRITE, true); require ../common.inc.php; $EXT[archiver_enable] or dheader(DT_PATH); //$DT_BOT or dheader(DT_PATH); $N = $M = $T = array(); $mid or $mid = 5; $vmid = $list = 0; foreach($MODULE as $…

外委项目进度控制全攻略:产品经理如何实现精准把控

在现代企业的项目管理中,尤其是面对外委项目,产品经理扮演着至关重要的角色。作为项目的核心负责人,产品经理需要不仅要把控产品质量,还要合理安排开发进度、协调各方资源,并确保项目能够按期、按质交付。尤其对于外委项目来说,由于涉及到第三方供应商和多个团队的协作,…

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型Aq

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整流程。后训练通常涵盖监督指导微调和对齐过程,而这些在ChatGPT的…

15个必备项目管理软件与10款最常用的,最终你选哪款?

项目管理软件在现代项目管理中扮演着至关重要的角色,它能帮助团队理清项目脉络、实时追踪进度、确保任务按时完成,提升团队工作效率和协作能力。 在当今竞争激烈的商业环境中,项目的复杂性和多样性不断增加,项目管理软件成为了不可或缺的工具。它可以将庞大的项目分解为具体…

【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA?

【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA? 重要性:★★ 💯 NLP G【NLP高频面题 - LLM架构篇】LLM为何使用GQA代替MHA? 重要性:★★ 💯NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部…

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化? ⚠︎ 重要性:★★【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化? ⚠︎ 重要性:★★★ 💯NLP Github 项目:NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、…

Win7 .lnk快捷方式被绑定到以wps打开导致所有快捷方式失效

最终通过FileTypesMan解决问题,FileTypesMan可以非常详细的编辑文件类型,找到.lnk,把用户选择项内容按退格键删除:让.lnk属性保持这样:正常的.lnk配置如下:保证类型名称是inkfile,用户选择处为空。 .lnkfile有的电脑没有,也是正常的 重启电脑或者结束explorer进程,重新打…

【应急响应】Linux 计划任务与 DFIR 排查实践(二)

#linux应急响应 at服务 #cron 服务 #隐藏任务 🔖 在上一节【linux应急响应】Linux 计划任务与 DFIR 排查实践(一)中,我们深入探讨了 cron 服务,从基础排查到隐藏任务的分析排查,这一节我们一块看看cron的小兄弟at服务。免责声明 本公众号文章中的程序、方法、信息和工具…

vxe-table 表格中使用 element-ui 组件库的

在公司开发大型项目中,使用主流表格库 vxe-table 和 element-ui 组件库,可以在可编辑单元格中渲染非常简单的使用更多的组件 官网:https://vxetable.cn 安装 npm install vxe-pc-ui@3.3.9 vxe-table@3.11.10 @vxe-ui/plugin-render-element@3.0.0// ... import { VxeUI } fr…

独立开发者应该如何设计产品网站

我看到很多产品开发者习惯于先去“找模板”,再就着模板向里面填充内容,这是不对的。首先自己的思路是否理清了,其次所谓的模板,其内容层次结构是否适合自己的产品?我看到一些产品网站虽然看起来还算漂亮,但是传递的内容十分有限。背景 我在业余时间开发了一款自己的独立产…

七种方式监听前端代码报错

错误类型 1 SyntaxError SyntaxError是构建阶段错误,非运行阶段。解析时候发生语法错误无法捕获 2 TypeError TypeError 指的是:值不是所期待的类型3 ReferenceError ReferenceError 指的是:引用未声明的变量4 RangeErrorRangeError 指的是:当一个值不在其所允许的范围或者…

如何记录网站来访者的IP地址

js如何记录来访者ipEdit2 • 2024年9月23日 下午12:49 • 百科 JS如何记录来访者IP:使用服务器端语言、调用第三方API服务、结合前端和后端技术在JavaScript中,直接获取来访者的IP地址并不容易,因为JavaScript运行在客户端环境中,而IP地址信息通常在服务器端获取。为了实…