gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:39:50 33 4
gpt4 key购买 nike

我正在使用 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 (since Linux 2.5.46)
Populate (prefault) page tables for a mapping. For a file mapping, this causes read-ahead on the file. Later accesses to the mapping will not be blocked by page faults. MAP_POPULATE is supported for private mappings only since Linux 2.6.23.

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

关于c++ - 将文件映射到 RAM 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32074229/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com