Windows利用頁交換文件來擴(kuò)充應(yīng)用程序?qū)嶋H可用的內(nèi)存,而不僅限于實(shí)際的32兆或64兆物理內(nèi)存。但是Windows的頁交換文件是所有程序共用的,所以我們的程序要想獲得更大的內(nèi)存還是比較困難,比如600兆或者更多。難道就沒有辦法了嗎?Windows提供的內(nèi)存映射文件為我們提供解決問題的途徑。
在硬盤上建立一個600兆的文件,然后將它映射到我們進(jìn)程的地址空間,Windows會返回一個指向這塊內(nèi)存地址的指針,我可以像使用一個600兆的大數(shù)組一樣使用該指針,Windows會為我們做好從硬盤文件到內(nèi)存和從內(nèi)存到硬盤文件的交換工作,就像我們使用Windows本身的虛擬內(nèi)存一樣,不用我們費(fèi)一點(diǎn)心思,而且速度很快。
具體方法如下:
//先在硬盤上建立一個文件,訪問標(biāo)志為可讀寫,
hFile := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//創(chuàng)建文件映射對象, iFileSize指定要建立的映射文件的大小,例如600兆 則iFileSize = 1024 * 1024 *600。當(dāng)我們打開的硬盤上的文件沒有這么大時,Windows會自動將該文件擴(kuò)展到指定的大小。
hFileMap := CreateFileMapping(hFile, nil, Page_ReadWrite, 0, iFileSize, nil);
//將文件數(shù)據(jù)映射到進(jìn)程的地址空間
pData := MapViewOfFile(FMapHandle, FILE_MAP_WRITE, 0, 0, iFileSize);
然后我們就可以通過pData指針充分利用Windows為我們多擴(kuò)充的這600兆內(nèi)存了。當(dāng)然是用完以后,要做一些清場工作。
//從進(jìn)程的地址空間中撤銷映射
UnmapViewOfFile(pData);
//關(guān)閉文件映射對象和打開的文件
CloseHandle(hFileMap);
CloseHandle(hFile);
新聞熱點(diǎn)
疑難解答