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