[英]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.