C语言实现大数据文件的内存映射机制

C语言实现大数据文件的内存映射机制

摘要

本文主要讲述大量数据的文件的内存映射机制的实现。

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;
}
(0)

相关推荐

  • C语言从txt文件中逐行读入数据存到数组中的实现方法

    首先,要知道数据的存储格式是怎样的, 65 2 722 542 691 514 644 506 588 524 565 558 608 580 648 586 696 572 482 564 第一行表示数字的个数和维数,所以要先读入这些信息: <span style="white-space:pre"> </span>FILE *fp = fopen("2D_Jesscia_keypos.txt", "r"); if (

  • 详解C语言位域的使用与注意事项

    位域的定义 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作. 这样就可以把几 个不同的对象用一个字节的二进制位域来表示. 位域的定义和位域变量的说明

  • C语言 栈的表示和实现详细介绍

    C语言 栈的表示和实现详细介绍 定义:栈是限定仅在表尾进行插入和删除操作的线性表. 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针. 栈是允许在同一端进行插入和删除操作的特殊线性表.允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom):栈底固定,而栈顶浮动:

  • C语言实现返回字符串函数的四种方法

    前言 C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 使用分配的内存,地址是有效 char *fun() { char* s = (char*)calloc(100, sizeof(char*) ); if (s) strcpy ( s , "abc " ); return s; } 但这种方式

  • C语言设计一个闪闪的圣诞树

    控制台打印一个圣诞树:简简单单的C语言知识,真的很基础,小白也能看得懂哦 /******************************* 圣诞树 byC语言小白入门 *******************************/ #include<stdio.h> #include <stdlib.h> #include <time.h> #include<Windows.h> #define X 25 //画面长度 int background[20]

  • c语言实现把文件中数据读取并存到数组中

    1.txt 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 2.txt 1 2 3 4 5 2 3 4 5 6 4 5 6 7 8 程序代码: // C++读取文本到数组.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" int readfile1D() { char a[100]; int i; FILE *fp = fopen("1.txt","r"); if(fp =

  • C语言编程中建立和解除内存映射的方法

    C语言mmap()函数:建立内存映射 头文件: #include <unistd.h> #include <sys/mman.h> 定义函数:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize); 函数说明:mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写. 参数说明: 返回值:若映射成功则返回映射区的内存起始地址,否则返回MAP_

  • 使用C语言编写圣诞表白程序

    快到圣诞节啦,男票女票都有了嘛?没有的话,有没有喜欢的女孩子或者男孩子啊?今天就给你们分享一个圣诞节的表白程序,希望你们喜欢咯,效果是这样的: 圣诞节快到了,让我们用C语言制作一个圣诞表白程序 具体代码如下咯: // GreetingCardDemoDlg.cpp : 实现文件 // #include "stdafx.h" #include "GreetingCardDemo.h" #include "GreetingCardDemoDlg.h"

  • 使用C语言判断栈的方向实例

    这一问题主要是如何判读出先后入栈的变量的地址大小,比如有a, b两个变量一先一后被定义,如果a的地址大于b的地址,则说明是以低地址方向增长的,反之,往高地址方向增长.在写C程序的时候不能简单直接的定义两个变量来比较它们的地址大小,因为这样很有可能编译器会做优化,最终导致结果不真实.为避免这种编译器优化的情况,可以采用将变量定义到函数中,然后递归调用该函数. 例如下面的代码: #include <stdio.h> static int stack_direction = 0; static vo

  • C语言 文件操作解析详解及实例代码

    C语言文件操作解析 在文件操作中除了打开操作以及读写操作,还有几种比较常见的操作.下面介绍一下这些操作中涉及到的函数. 一.移动位置指针的函数 rewind函数和fseek函数,这两个函数的原型是: void rewind(FILE *fp);     将位置指针移动到文件首 int fseek(FILE *fp,long int offset,int origin);   将位置指针移动到距离origin的offset字节数的位置 其中对于fseek函数中的参数,origin为起始点,offs

  • C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例:求 15750 与27216的最大公约数. 解: ∵27216=15750×1+11466 ∴(15750,27216)=(15750,11466) ∵15750=11466×1+4284  ∴(15750,11466)=(11466,4284) ∵11466=4284×2+2898  ∴(114

  • C语言 经典题目螺旋矩阵 实例详解

    C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include <stdio.h> #include <stdlib.h> int main() { int N,i,j,n,num=1; int a[10][10]={0}; printf("输入你要输出的几阶中断:"); scanf("%d",&N); for(n=0;n<=N/2;n++) { for(j=n;j<=N-n-1;j++) a[n][j]=num++; fo

  • 利用C语言的Cairo图形库绘制太极图实例教程

    前言 可能许多人对直接用C语言绘图仍然停留在Turbo C的graphics.h年代,或许也有教育老化的原因,毕竟曾经的经典早已成往事,与其想尽各种办法寻找与其兼容的图形库,不如顺势拥抱灿烂的明天.Cario(http://cairographics.org/)是一个非常出色的2D图形库,著名的GTK+3.0完全采用Cario作为绘图引擎,由此可见它的强大和吸引力. Cario支持X Window,Quartz,Win32,image.buffers,PostScript,PDF和SVG文件等多

随机推荐