1. 程式人生 > >C/C++(5)實現大資料檔案的記憶體對映機制

C/C++(5)實現大資料檔案的記憶體對映機制

摘要

本文主要講述大量資料的檔案的記憶體對映機制的實現。

1. 記憶體對映

記憶體對映檔案,是由一個檔案到一塊記憶體的對映。Win32提供了允許應用程式把檔案對映到一個程序的函式 (CreateFileMapping)。記憶體對映檔案與虛擬記憶體有些類似,通過記憶體對映檔案可以保留一個地址空間的區域,同時將物理儲存器提交給此區域,記憶體檔案對映的物理儲存器來自一個已經存在於磁碟上的檔案,而且在對該檔案進行操作之前必須首先對檔案進行對映。使用記憶體對映檔案處理儲存於磁碟上的檔案時,將不必再對檔案執行I/O操作,使得記憶體對映檔案在處理大資料量的檔案時能起到相當重要的作用。

2. 實現

#include "stdafx.h"
#include "windows.h"
#include <iostream>
#include <fstream>

using namespace std;
 

int main(int argc, _TCHAR* argv[]){

   //// Open the file that we want to map.
   HANDLE hFile = ::CreateFile(L"C:/Users/Joe WANG/Desktop/Data.txt",
	  GENERIC_READ | GENERIC_WRITE,
	  0,
	  NULL,
	  OPEN_ALWAYS,
	  FILE_ATTRIBUTE_NORMAL,
	  NULL);

   // Create a file-mapping object for the file.
   HANDLE hFileMapping = ::CreateFileMapping(hFile,
	  NULL,
	  PAGE_WRITECOPY,
	  0, 0,
	  NULL);

	// Now map the file
   PCHAR pbFile = (PCHAR)::MapViewOfFile(hFileMapping, FILE_MAP_COPY, 0, 0, 0);
  
   // Print result
   printf("%s\n", ((string)pbFile).c_str()); 

	// Close all file handle
   ::UnmapViewOfFile(pbFile);
   ::CloseHandle(hFileMapping);
   ::CloseHandle(hFile);
 
   return 0;
}