C言語で大きなデータファイルを実現するメモリマッピングメカニズム


C言語で大きなデータファイルを実現するメモリマッピングメカニズム
要約
本論文は主に大量のデータのファイルのメモリマッピング機構の実現について述べる。
1.メモリマップ
メモリマップファイルは、一つのファイルから一つのメモリへのマッピングです。Win 32は、アプリケーションがファイルをプロセスにマッピングすることを許可する関数(CreateFileMapping)を提供する。メモリマップファイルは仮想メモリと似ていますが、メモリマップファイルを介してアドレス空間の領域を保持しながら、この領域に物理メモリを提出します。メモリファイルマッピングの物理メモリはディスク上に既に存在しているファイルから来ています。ファイルを操作する前に、まずファイルをマッピングしなければなりません。メモリマッピングファイルを使ってディスクに格納されたファイルを処理する場合、メモリマップファイルは、大きなデータ量のファイルを処理する際に、かなり重要な役割を果たすことができます。
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
", ((string)pbFile).c_str()); // Close all file handle ::UnmapViewOfFile(pbFile); ::CloseHandle(hFileMapping); ::CloseHandle(hFile); return 0; }