繁体   English   中英

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

[英]Optimal method to mmap a file to 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]; 
}

这是最好的方法吗? 如果没有,什么是更有效的方法? 我发生在函数中,并且cs在函数外部声明。 退出函数后,我将保留cs ,但是cs_virt是否需要删除,或者因为它在函数中本地声明,它是否会自行消失?

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

MAP_POPULATE (从Linux 2.5.46开始)
填充(故障前)页表以进行映射。 对于文件映射,这将导致文件上的预读。 页面错误不会阻止以后对映射的访问。 MAP_POPULATE Linux 2.6.23开始,专用映射才支持MAP_POPULATE

如果您在mmap()时有时间空闲,但是以后的访问需要响应,则这可能很有用。 如果您确实需要将文件映射到并且永不换回,请考虑MAP_LOCKED

MPI和I / O是一个模糊的问题。 HDF5似乎是最常见的库,可以帮助您解决此问题,但是它通常需要针对特定​​集群进行调优,而对于单纯的集群用户而言,这通常是不可能的。 我的一个同事在SIONlib上取得了更好的成功,并且能够使他的代码在JUGENE上的近1e6内核上运行,因此,我来​​看看。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM