我正在从事的一个项目中,我需要将一个大型数组加载到内存中,构造各种索引和派生数据,并在完成加载和处理后,确保从其他进程访问这些数据的最大速度,而不会产生使用SQL/NoSQL和进程间通信(IPC)的开销.此外,利用这些经过处理的数据的过程几乎需要立即开始.

在这种情况下,使用mmap替代堆以实现对另一个进程创建的内存数据的快速访问而不需要重新处理它是否可行?

此外,我还面临着通过mmap动态分配地址的挑战,mmap在地址空间中分配随机地址.在这方面,有没有办法改变mmap的行为?我是否应该考虑使用某种形式的索引或偏移量?或者,有没有一种完全不同的方法更适合这项任务?

推荐答案

mmap美元就能解决你的问题了.它的行为正是你所需要的.

mmap提供的地址是进程本地的虚拟内存地址.将其视为基址并使用偏移量来访问内容.

当您在不同的进程中使用相同的文件时,它将提供另一个地址,该地址将是新进程本地的虚拟内存地址.再次将该地址视为来自新进程的访问的基址,并像以前一样使用偏移量.

文件系统将通过文件名使所有进程都可以访问数据.如果您不想让其他进程访问数据,可以使用memfd_create并使用其他IPC机制发送文件描述符.

C++相关问答推荐

C指针算法在函数参数中的应用

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

我在这里正确地解释了C操作顺序吗?

在 struct 中强制转换空指针

每个 struct 变量在C中都有自己的命名空间吗?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

如何使用C++在控制台中以彩色打印被阻止的客户端

Boyer Moore算法的简单版本中的未定义行为

通过描述符查找文件路径时出现问题

Caesar密码调试:输出文本末尾的问号和随机字符

理解bzip2的BZ2_解压缩函数中的状态重新分配

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

递归打印二维数组(C编程)

Zlib:解压缩大文件导致";无效代码长度设置";错误

STM32 FATFS用户手册(Um1721)中的代码正确吗?

如何找出C中分配在堆上的数组的大小?

为什么需要struct in_addr

段错误try 访问静态字符串,但仅有时取决于构建环境