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