我正在使用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:



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

09-25 19:40