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

时间:2015-08-18 13:45:50

标签: c++ memory mmap

我正在使用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]; 
}

这是最好的方法吗?如果没有,那么更有效的方法是什么?我在一个函数中发生了这个,并且在函数外面声明了cs。退出该功能后,我会保留cs,但cs_virt是否需要删除,或者它会自动删除,因为它是在函数本地声明的?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Linux,则可以使用MAP_POPULATE

  

MAP_POPULATE(自Linux 2.5.46起)
   填充(prefault)页表以进行映射。对于文件映射,这会导致对文件进行预读。后来   页面错误不会阻止对映射的访问。   私有映射支持MAP_POPULATE                     仅限Linux 2.6.23。

如果您在mmap()时有空闲时间,但是您以后的访问需要响应,这可能很有用。如果你真的需要映射文件并且从不换回来,也要考虑MAP_LOCKED

答案 1 :(得分:0)

MPI和I / O是个棘手的问题。 HDF5似乎是可以帮助您解决此问题的最常见的库,但它通常需要针对特定​​群集进行调整,这对于群集的用户来说通常是不可能的。我的一位同事用SIONlib取得了更好的成功,并且能够让他的代码在JUGENE的近1e6核心上工作,所以我会看看它。

在这两种情况下,您可能需要调整文件格式。在我的同事的情况下,它甚至付钱使用SIONlib以并行方式编写数据,并且稍后进行顺序后处理以“碎片整理”剩下的漏洞是SIONlib选择的并行访问模式。输入可能类似。

相关问题