簡體   English   中英

將文件映射到RAM的最佳方法?

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

MPI和I / O是一個模糊的問題。 HDF5似乎是最常見的庫,可以幫助您解決此問題,但是它通常需要針對特定​​集群進行調優,而對於單純的集群用戶而言,這通常是不可能的。 我的一個同事在SIONlib上取得了更好的成功,並且能夠使他的代碼在JUGENE上的近1e6內核上運行,因此,我來​​看看。

在這兩種情況下,您可能都需要調整文件格式。 在我的同事的情況下,甚至還可以使用SIONlib以並行方式寫入數據,並隨后進行順序的后處理以“整理”剩下的漏洞,這是SIONlib選擇的並行訪問模式。 輸入可能相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM