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