C++ 将文件映射到RAM的最佳方法?

C++ 将文件映射到RAM的最佳方法?,c++,memory,mmap,C++,Memory,Mmap,我正在使用mmap读取一个文件,直到最近我才发现它实际上并没有将其放入RAM中,而只是为它创建了一个虚拟地址空间。这将导致对数据的任何访问仍然使用我希望避免的磁盘,所以我希望将其全部读取到RAM中 我正在通过以下方式读取文件: char* cs_virt; cs_virt = (char*)mmap(0, nchars, PROT_READ, MAP_PRIVATE, finp, offset); 当我在这之后循环时,我看到这个过程的虚拟内存确实被破坏了。不过,我想将其复制到RAM中,因此我执

我正在使用
mmap
读取一个文件,直到最近我才发现它实际上并没有将其放入RAM中,而只是为它创建了一个虚拟地址空间。这将导致对数据的任何访问仍然使用我希望避免的磁盘,所以我希望将其全部读取到RAM中

我正在通过以下方式读取文件:

char* cs_virt;
cs_virt = (char*)mmap(0, nchars, PROT_READ, MAP_PRIVATE, finp, offset);
当我在这之后循环时,我看到这个过程的虚拟内存确实被破坏了。不过,我想将其复制到RAM中,因此我执行以下操作:

char* cs_virt;
cs_virt = (char*)mmap(0, nchars, PROT_READ, MAP_PRIVATE, finp, offset);
cs = (char*)malloc(nchars*sizeof(char));
for(int ichar = 0; ichar < nchars; ichar++) {
    cs[ichar] = cs_virt[ichar]; 
}
char*cs\u virt;
cs_virt=(char*)mmap(0,nchars,PROT_READ,MAP_PRIVATE,finp,offset);
cs=(char*)malloc(nchars*sizeof(char));
对于(int-ichar=0;ichar

这是最好的方法吗?如果没有,什么方法更有效?我在函数中执行此操作,并且
cs
在函数外部声明。退出函数后,我将保留
cs
,但是
cs\u virt
需要删除,还是会自动删除,因为它是在函数中本地声明的?

MPI和I/O是一个模糊的问题。这似乎是最常见的库,可以帮助您实现这一点,但它通常需要针对特定集群进行调优,这对于集群的用户来说通常是不可能的。我的一位同事在这方面取得了更好的成功,并且能够让他的代码在JUGENE上的近1e6内核上运行,所以我必须看看这一点


在这两种情况下,您可能需要调整文件格式。在我的同事的例子中,使用SIONlib以并行方式写入数据,然后进行顺序后处理以“整理”SIONlib选择的并行访问模式留下的漏洞,这甚至是值得的。输入可能类似。

如果您使用的是Linux,则可以使用
MAP\u-POPULATE

MAP\u POPULATE
(从Linux 2.5.46开始)
为映射填充(预故障)页表。对于文件映射,这会导致对文件进行预读。后来 页面错误不会阻止对映射的访问。 私有映射支持
MAP\u POPULATE
仅在Linux2.6.23之后


如果您在
mmap()
时有空闲时间,但以后的访问需要响应,那么这可能很有用。也可以考虑<代码> MAPIXOLD 如果你真的需要这个文件被映射,并且从来没有交换回来。< /P>你为什么要把它变成RAM?是否要使用此数据分析某些代码,并消除计时中的I/O?答案取决于更多的上下文。当您实际上不想要它提供的好处(即操作系统提供的文件内容缓冲区/页面管理)时,为什么要使用
mmap()
?另外:
cs\u virt
至少需要一个
munmap(cs\u cirt,nchars)
。使用
memcpy()
(如果有的话)。为什么需要
mmap()
?如果您只需要对其进行读取访问,只需使用
stl fstream
读取内存中的整个文件,您就可以进行设置。这是一个非常大的数据量,瓶颈是i/o。我是用mpi写这篇文章的,每个进程都位于不同的主机上,该主机可以访问高度并行的共享存储体系结构。我想以最有效的方式读取一次,我认为
mmap
可以帮助我实现这一点,因为我可以将文件解析为
n
块和
mmap
大块,以便并行处理数据。例如,逐行读取可以将其放入内存,但是,每条线的数据量不足以获得从共享存储到CPU的高吞吐量。