我正在使用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
是否需要删除,或者它会自动删除,因为它是在函数本地声明的?
答案 0 :(得分:1)
如果您使用的是Linux,则可以使用MAP_POPULATE
:
MAP_POPULATE
(自Linux 2.5.46起)
填充(prefault)页表以进行映射。对于文件映射,这会导致对文件进行预读。后来 页面错误不会阻止对映射的访问。 私有映射支持MAP_POPULATE
仅限Linux 2.6.23。
如果您在mmap()
时有空闲时间,但是您以后的访问需要响应,这可能很有用。如果你真的需要映射文件并且从不换回来,也要考虑MAP_LOCKED
。
答案 1 :(得分:0)