【转载】VC中用内存映射文件处理大…

内存映射技术(共享内存) 内存映射 : 内存映射文件不同于文件I/O操作,内存映射实际用到了Windows的核心编程技术–内存管理。 使用内存映射文件的一般方法:   首先要通过CreateFile()函数来创建或打开一个文件内核对象,这个对象标识了磁盘上将要用作内存映射文件的文件。 在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。 为了指定文件映射对... 阅读详情
引言

  文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所需要的动辄几十GB、几百GB、乃至几TB的海量存储,再以通常的文件处理方法进行处理显然是行不通的。目前,对于上述这种大文件的操作一般是以内存映射文件的方式来加以处理的,本文下面将针对这种Windows核心编程技术展开讨论。

  内存映射文件概述

  内存文件映射也是Windows的一种内存管理方法,提供了一个统一的内存管理特征,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问。通过文件映射这种使磁盘文件的全部或部分内容与进程虚拟地址空间的某个区域建立映射关联的能力,可以直接对被映射的文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理。内存文件映射的这种特性是非常适合于用来管理大尺寸文件的。

  在使用内存映射文件进行I/O处理时,系统对数据的传输按页面来进行。至于内部的所有内存页面则是由虚拟内存管理器来负责管理,由其来决定内存页面何时被分页到磁盘,哪些页面应该被释放以便为其它进程提供空闲空间,以及每个进程可以拥有超出实际分配物理内存之外的多少个页面空间等等。由于虚拟内存管理器是以一种统一的方式来处理所有磁盘I/O的(以页面为单位对内存数据进行读写),因此这种优化使其有能力以足够快的速度来处理内存操作。

  使用内存映射文件时所进行的任何实际I/O交互都是在内存中进行并以标准的内存地址形式来访问。磁盘的周期性分页也是由操作系统在后台隐蔽实现的,对应用程序而言是完全透明的。内存映射文件的这种特性在进行大文件的磁盘事务操作时将获得很高的效益。

  需要说明的是,在系统的正常的分页操作过程中,内存映射文件并非一成不变的,它将被定期更新。如果系统要使用的页面目前正被某个内存映射文件所占用,系统将释放此页面,如果页面数据尚未保存,系统将在释放页面之前自动完成页面数据到磁盘的写入。

  对于使用页虚拟存储管理的Windows操作系统,内存映射文件是其内部已有的内存管理组件的一个扩充。由可执行代码页面和数据页面组成的应用程序可根据需要由操作系统来将这些页面换进或换出内存。如果内存中的某个页面不再需要,操作系统将撤消此页面原拥用者对它的控制权,并释放该页面以供其它进程使用。只有在该页面再次成为需求页面时,才会从磁盘上的可执行文件重新读入内存。同样地,当一个进程初始化启动时,内存的页面将用来存储该应用程序的静态、动态数据,一旦对它们的操作被提交,这些页面也将被备份至系统的页面文件,这与可执行文件被用来备份执行代码页面的过程是很类似的。图1展示了代码页面和数据页面在磁盘存储器上的备份过程:


图1 进程的代码页、数据页在磁盘存储器上的备份

  显然,如果可以采取同一种方式来处理代码和数据页面,无疑将会提高程序的执行效率,而内存映射文件的使用恰恰可以满足此需求。

对大文件的管理

  内存映射文件对象在关闭对象之前并没有必要撤销内存映射文件的所有视图。在对象被释放之前,所有的脏页面将自动写入磁盘。通过CloseHandle()关闭内存映射文件对象,只是释放该对象,如果内存映射文件代表的是磁盘文件,那么还需要调用标准文件I/O函数来将其关闭。在处理大文件处理时,内存映射文件将表示出卓越的优势,只需要消耗极少的物理资源,对系统的影响微乎其微。下面先给出内存映射文件的一般编程流程框图:


图2 使用内存映射文件的一般流程

  而在某些特殊行业,经常要面对十几GB乃至几十GB容量的巨型文件,而一个32位进程所拥有的虚拟地址空间只有232 = 4GB,显然不能一次将文件映像全部映射进来。对于这种情况只能依次将大文件的各个部分映射到进程中的一个较小的地址空间。这需要对上面的一般流程进行适当的更改:

  1)映射文件开头的映像。

  2)对该映像进行访问。

  3)取消此映像

  4)映射一个从文件中的一个更深的位移开始的新映像。

  5)重复步骤2,直到访问完全部的文件数据。

  下面给出一段根据此描述而写出的对大于4GB的文件的处理代码:

// 选择文件
CFileDialog fileDlg(TRUE, "*.txt", "*.txt", NULL, "文本文件 (*.txt)|*.txt||", this);
fileDlg.m_ofn.Flags |= OFN_FILEMUSTEXIST;
fileDlg.m_ofn.lpstrTitle = "通过内存映射文件读取数据";
if (fileDlg.DoModal() == IDOK)
{
 // 创建文件对象
 HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_READ | GENERIC_WRITE,
   0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 if (hFile == INVALID_HANDLE_VALUE)
 {
  TRACE("创建文件对象失败,错误代码:%drn", GetLastError());
  return;
 }
 // 创建文件映射对象
 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
 if (hFileMap == NULL)
 {
  TRACE("创建文件映射对象失败,错误代码:%drn", GetLastError());
  return;
 }
 // 得到系统分配粒度
 SYSTEM_INFO SysInfo;
 GetSystemInfo(&SysInfo);
 DWORD dwGran = SysInfo.dwAllocationGranularity;
 // 得到文件尺寸
 DWORD dwFileSizeHigh;
 __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
 qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
 // 关闭文件对象
 CloseHandle(hFile);
 // 偏移地址 
 __int64 qwFileOffset = 0;
 // 块大小
 DWORD dwBlockBytes = 1000 * dwGran;
 if (qwFileSize < 1000 * dwGran)
  dwBlockBytes = (DWORD)qwFileSize;
  while (qwFileOffset > 0)
  {
   // 映射视图
   LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS, 
      (DWORD)(qwFileOffset >> 32), (DWORD)(qwFileOffset & 0xFFFFFFFF),
      dwBlockBytes);
   if (lpbMapAddress == NULL)
   {
    TRACE("映射文件映射失败,错误代码:%drn", GetLastError());
    return;
   }
   // 对映射的视图进行访问
   for(DWORD i = 0; i < dwBlockBytes; i++)
    BYTE temp = *(lpbMapAddress + i);
    // 撤消文件映像
    UnmapViewOfFile(lpbMapAddress);
    // 修正参数
    qwFileOffset += dwBlockBytes;
    qwFileSize -= dwBlockBytes;
  }
  // 关闭文件映射对象句柄
  CloseHandle(hFileMap);
  AfxMessageBox("成功完成对文件的访问");
}


  在本例中,首先通过GetFileSize()得到被处理文件长度(64位)的高32位和低32位值。然后在映射过程中设定每次映射的块大小为1000倍的分配粒度,如果文件长度小于1000倍的分配粒度时则将块大小设置为文件的实际长度。在处理过程中由映射、访问、撤消映射构成了一个循环处理。其中,每处理完一个文件块后都通过关闭文件映射对象来对每个文件块进行整理。CreateFileMapping()、MapViewOfFile()等函数是专门用来进行内存文件映射处理用的。

下面分别对这些关键函数进行说明:

  1)CreateFile():CreateFile()函数是一个用途非常广泛的函数, 在这里的用法并没有什么特殊的地方,但有几点需要注意:一是访问模式参数dwDesiredAccess。该参数设置了对文件内核对象的访问类型,其允许设置的权限可以为读权限GENERIC_READ、写权限GENERIC_WRITE、读写权限GENERIC_READ | GENERIC_WRITE和设备查询权限0。在使用映射文件时,只能打开那些具有可读访问权限的文件,即只能应用GENERIC_READ和GENERIC_READ | GENERIC_WRITE这两种组合;另一点需要注意的是共享模式参数dwShareMode。该参数定义了对文件内核对象的共享方式,其可能的设置为FILE_SHARE_READ、FILE_SHARE_WRITE和0,并可对其组合使用。其中,设置为0时不允许共享对象;FILE_SHARE_READ和FILE_SHARE_WRITE分别为在要求只读、只写访问的情况下才允许对象的共享。

  由于通过内存映射文件可以在多个进程间共享数据,因此在进行这种应用时应当考虑dwShareMode参数设置对运行结果的影响。

  2)CreateFileMapping():该函数的作用是创建一个文件映射内核对象,以告知系统文件映射对象需要多大的物理存储器。创建内存映射文件对象对系统资源几乎没有什么影响,也不会影响进程的虚拟地址空间。除了需要用来表示该对象的内部资源之外通常并不用为其分配虚拟内存,但是如果内存映射文件对象是作共享内存之用的话,就要在创建对象时由系统为内存映射文件的使用在系统页文件中保留足够的空间。

  函数第一个参数hFile为标识要映射到进程的地址空间的文件的句柄。虽然由于内存映射文件的物理存储器是来自于磁盘上的文件,而非系统的页文件,使创建内存映射文件就像保留一个地址空间区域并将物理存储器提交给该区域一样。第二个参数为指向文件映射内核对象的SECURITY_ATTRIBUTES结构的指针,由此来决定子进程能否继承得到返回的句柄。通常为其传递NULL值,以默认的安全属性来禁止返回句柄的被继承。

  接下来的参数用于文件被映射后设定文件映像的保护属性。其可能的取值为PAGE_READONLY、PAGE_READWRITE和PAGE_WRITECOPY。虽然在创建文件映射对象时,系统并不为其保留地址空间区域,也不将文件的存储器映射到该区域。但是,在系统将存储器映射到进程的地址空间中去时,系统必须确切知道应赋予物理存储器页面的保护属性。在设置保护属性时,必须与用CreateFile()函数打开文件时所指定的访问标识相匹配,否则将导致CreateFileMapping()的执行失败。因此这里设置PAGE_READWRITE属性。除了上述三个页面保护属性外,还有4个区(Section)保护属性也可以一起组合使用:

区保护属性说明
SEC_COMMIT为区中的所有页面在内存中或磁盘页面文件中分配物理存储器
SEC_IMAGE告知系统,映射的文件是一个可移植的EXE文件映像
SEC_NOCACHE告知系统,未将文件的任何内存映射文件放入高速缓存,多供硬件设备驱动程序开发人员使用
SEC_RESERVE对一个区的所有页面进行保留而不分配物理存储器


  后面的两个参数指定了要创建的文件映射对象的最大字节数的高32位值和低32位值,实际也就设定了文件的最大字节数(最大可以处理16EB的文件)。这两个参数可以满足确保文件映射对象能够得到足够的物理存储器这一基本条件。在参数设置的大小小于文件实际大小时,系统将从文件映射指定的字节数。这里将其设置为0,将使所创建的文件映射对象将为文件的当前大小,以上两种情况均无法改变文件的大小。如果设置的参数大于文件的实际大小,系统将会在CreateFileMapping()函数返回前扩展该文件。需要指出的是,文件映射对象的大小是静态的,一旦创建完毕后将无法更改。如果设置的文件映射对象尺寸偏小将导致无法对文件进行全面的访问。

  在本节开始也曾提到过,创建文件映射对象是不需要花费什么系统资源的,因此遵循"宁多勿缺"的原则,一般应将文件映射对象的大小设置为文件大小的相同值。函数最后的参数将可以为映射对象命名。如果想打开一个已存在的文件映射对象,该对象必须要命名。对该名字字符串的要求仅限于未被其它对象使用过的名字即可。

  CreateFileMapping()在成功执行后将返回一个指向文件映射对象的句柄。如果对一个已经存在的文件映射对象调用了CreateFileMapping()函数,进程将得到一个指向现有映射对象的句柄。通过调用GetLastError()可以得到返回值ERROR_ALREADY_EXIST,由此可以判断当前得到的内存映射对象句柄是新创建的还是打开已经存在的。如果系统无法创建文件映射对象,将导致CreateFileMapping()的执行失败,返回N U L L句柄值。

3)MapViewOfFile():当创建了一个内存映射文件对象并得到其有效句柄后,该句柄即可用来在进程的虚拟地址空间中映射文件的一个映像。在内存映射文件对象已经存在的情况下,映像可被任意映射或取消映射。在文件映像被映射时,仍然必须由系统来为文件的数据保留一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。在进程的地址空间中,一个足够大的连续地址空间(通常足以覆盖整个文件映像)将被指定给此文件映像。尽管如此,内存的物理页面还是根据在实际使用中的需求而进行分配的。真正分配一个对应于内存映射文件映像页面的物理内存页面是在发生该页的缺页中断时进行的,这将在第一次读写内存页面中的任一地址时自动完成。MapViewOfFile()即负责映射内存映射文件的一个映像,

  函数的第一个参数为CreateFileMapping()所返回的内存映射文件对象句柄,第二个参数指定了对文件映像的访问类型,可能取值有FILE_MAP_WRITE、FILE_MAP_READ、FILE_MAP_ALL_ACCESS和FILE_MAP_COPY等几种,具体的设置要根据文件映射对象允许的保护模式而定。根据前面代码的设置,这里应该使用FILE_MAP_ALL_ACCESS参数。这种机制为对象的创建者提供了对映射此对象的方式进行控制的能力。接下来的2个参数分别指定了内存映射文件的64位偏移地址的低32位和高32位地址,该地址是从内存映射文件头位置到映像开始位置的距离。最后的参数指定了视图的大小,如果设置为0,前面的偏移地址将被忽略,系统将会把整个文件映射为一个映像。MapViewOfFile()如果成功执行,将返回一个指向文件映像在进程的地址空间中的起始地址的指针。如果失败,则返回NULL。在进程中,可以为同一个文件映射对象创建多个文件映像,这些映像可以在系统中共存和重叠,也可以与对应的文件映射对象大小不相一致,但不能大于文件映射对象的大小。

  4)UnmapViewOfFile():当不再需要保留映射到进程地址空间区域中的文件映像数据时,可通过调用UnmapViewOfFile()函数将其释放。该函数结构非常简单,只需要提供映像在进程中的起始地址(区域的基地址)作为参数即可。该函数的输入参数为调用MapViewOfFile()时所返回的指向文件映像在进程的地址空间中的起始地址的指针。在调用MapViewOfFile()后,必须确保在进程退出之前能够执行UnmapViewOfFile()函数,否则在进程终止之后先前保留的区域将得不到释放,即使再次启动进程重复调用MapViewOfFile()系统也总是在进程的地址空间中保留一个新的区域,而此前保留的所有区域将得不到释放。

  一种比较特殊的情况是,对同一个内存映射文件映射了两个相同的映像的撤消。前面曾经提到过,对于同一个内存映射文件可以有多个映像,这些映像也可以重叠,因此这种情况的存在是合法的。对于这种情况,虽然从表面看上去在单进程的地址空间内是不可能存在两个基地址完全相同的映像的,这将导致无法对这它们的区分。但是事实上,由MapViewOfFile()所返回得到的基地址只是文件映像在进程地址空间中的起始基地址,因此在映射同一内存映射文件的两个相同映像时将会产生对内存映射文件同一部分的两个不同基地址的相同映像,可以用同样的方法调用UnmapViewOfFile()将其从进程的地址空间中予以撤消。

  5)CloseHandle(): 与Win32的大多数对象一样,在使用完毕之后总是要通过CloseHandle()函数将已打开的内核对象关闭。如果忘记关闭对象,在程序继续运行时将会出现资源泄漏。虽然在程序退出运行时,操作系统会自动关闭在进程中已经打开但未关闭的任何对象。但是在进程的运行过程中,势必会积累过多的资源句柄。因此在不再需要使用对象的时候通过CloseHandle()将其予以关闭是有意义的。

  小结

  本文对内存映射文件在大文件处理中的应用作了较为详细的阐述。经实际测试,内存映射文件在处理大数据量文件时表现出了良好的性能,比通常使用CFile类和ReadFile()和WriteFile()等函数的文件处理方式具有明显的优势。本文所述程序代码在Windows 2000 Professional下由Microsoft Visual C++ 6.0编译通过。

 
C语言-内存映射(大文件处理)(创建文件映射内核对象然后在映射到内存地址空间中,当作无类型指针使用) C语言-内存映射是什么,根据自己粗浅的学习理解,总结为——创建一个文件映射内核对象然,然后在把文件映射内核对象映射到内存地址空间中,然后我们拿这个内存地址(也就是无类型类型指针)对内存空间(也就相当与硬盘上的文件)进行操作了。 这里面包含了三大内容(内村指针就不介绍了):文件打开或创建、文件映射内核对象,映射文件映射到内存地址空间 1、文件打开或创建CreateFile CreateFi... 阅读详情

相关推荐

MFC通过文件内存映射实现资源共享

共享资源的访问方式很多,文件内存映射是比较快速的一种

ARM_QT2019的博客 678

VC中用内存映射文件处理大文件

VC中用内存映射文件处理大文件 来源: yesky 编辑: 作者:中国电波传播研究所青岛分所 郎?

1150

SV fork join_none & for循环结合使用

fork join_none与循环联用常见问题解决方案

ZhangShuHuai11的博客 880

Windows核心编程 - Windows内存体系结构(4)

1. 写时复制 PAGE_WRITECOPY和PAGE_EXECUTE_WRITECOPY这两个保护属性存在的目的是为了节省内存和使用页交换文件。Windows支持一种机制,允许两个或两个以上的进程共享同一块存储器。让应用程序实例共享相同的存储页极大地提升了系统的性能,但另一方面,也要求所有的应用程序实例只能读取其中的数据 或是执行其中的代码。如果某个应用程序实例修改并写入一个存储页...

yjianlu的专栏 893

MCU中GPIO口的驱动方式

MCU中GPIO口的驱动方式 导读: MCU芯片中GPIO口的驱动方式大的可分为输出和输入两类,小的分可以分为8种。 一、四种输入方式 ①上拉输入: 上拉输入抗干扰能力强,特别适合接地信号的输入(比如低电平有效的按键信号输入)。其工作原理如图1所示。 I/O 端口与TTL 施密特触发器之前接入了一个30K~50K 欧姆的上拉电阻,当I/O 端口悬空时,此时MCU 也能读到稳定的高电平状态,...

优快云Frewen的博客 3373

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

[转][VC/MFC]关于内存映射文件技术处理大文件的读写

Windows对文件的读写提供了很丰富的操作手段,如:1. FILE *fp, fstearm...; (C/C++)2. CFile, CStdioFile...; (MFC)3. CreateFile, ReadFile...;(API)...在处理一般的文件(文本/非文本),这些足够了。然而在处理比较大的文件如几十M, 几百M, 甚至上G的文件, 这时再用一般手段处理,系统就显的力不从心

believefym的专栏 1万+

从门禁到支付:Uniapp+NFC开发避坑指南(支持Mifare Classic)

本文详细介绍了Uniapp结合NFC技术开发门禁与支付系统的实战指南,特别针对Mifare Classic卡片进行深度优化。内容涵盖环境配置、设备兼容性处理、卡片安全机制解析以及高性能读写优化策略,帮助开发者快速实现跨平台的智能硬件交互解决方案。

t1u2v的博客 751

[转][VC/MFC]关于内存映射文件技术处理大文件的读写-例

Windows对文件的读写提供了很丰富的操作手段,如: 1. FILE *fp, fstearm...; (C/C++) 2. CFile, CStdioFile...; (MFC) 3. CreateFile, ReadFile...;(API) ... 在处理一般的文件(文本/非文本),这些足够了。然而在处理比较大的文件如 几十M, 几百M, 甚至上G的文件, 这时再用一般手段处理,系统就显的力不从心了 要把文件读出,再写进,耗费的是CPU利用率与内存以及IO的频繁操作。这显然是

ssss5257的专栏 1546

利用ArcMap实现遥感图像语义分割标注的完整流程解析

本文详细解析了利用ArcMap进行遥感图像语义分割标注的完整工作流。从工程创建、数据导入、SHP文件创建,到实战勾画地物、要素转栅格,再到最终的裁剪对齐,提供了每一步的关键操作与避坑指南。该方法特别适合处理大尺寸、带地理坐标的遥感影像,能高效产出精准对齐的图像-标签对,为后续深度学习模型训练奠定可靠的数据基础。

gpu4optimizer的博客 1213

HyperLynx(十八)DDR(一)DDR简介和DDR的数据仿真

LVTTL电平为单端信号,而SSTL电平本质上是差分对,其实现机制是将信号与参考电平Vref组成差分对进行比较,如图所示,VIH和VIL各有一个交流参数AC和直流参数DC,信号第一次越过AC门限的时刻,作为时序计算的参考点,此后只要信号保持DC门限内,逻辑状态保持不变,这种设计减小了噪声、振铃等对于信号质量的影响。经过调整后,控制器在发送颗粒1的DQS后,延时1ns再发送颗粒2的DQS,则颗粒1在1ns后收到对齐的DQS和CLK,颗粒2在2ns后收到对齐的DQS和CLK,从而满足了时序关系。

小幽余生不加糖 7676

关于内存映射文件技术处理大文件的读写

南航 李芳(C/C++学生) 599

码农新宠大对决:GitHub Copilot、通义灵码和CodeLlama谁主沉浮?

本文对三款主流AI编程工具GitHub Copilot、通义灵码和CodeLlama进行了全面对比分析。GitHub Copilot在多语言支持和代码质量上表现突出;通义灵码在中文理解和阿里云生态集成方面优势明显;CodeLlama则以开源可定制见长。文章从代码生成、理解能力、多语言支持、使用体验等维度展开评测,并结合实际案例说明不同开发者群体的适用选择。建议新手可优先考虑通义灵码,经验开发者适合GitHub Copilot,而有定制需求的企业团队则可选择CodeLlama。随着AI技术发展,这些工具将持续

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 675

利用内存映射文件处理大文件(转载)(修改程序版)

 ----原来作者的程序有些问题,现在文章中的程序已经修改正确---VC中用内存映射文件处理大文件 摘要:本文通过内存映射文件的使用来对大尺寸文件进行访问操作,同时也对内存映射文件的相关概念和一般编程过程作了较为详细的介绍。  关键词:内存映射文件;大文件处理;分配粒度  引言  文件操作是应用程序最为基本的功能之一,Win32 API和MFC均

青青的专栏--C/C++ OOA/D Design Pattern 3955

Test软件:Keysight二次开发_(1).Keysight软件开发概述

VISA(Virtual Instrument Software Architecture)库是Keysight提供的一种标准化的仪器控制接口,支持多种编程语言和开发环境。仪器通信:通过GPIB、USB、以太网等接口与仪器进行通信。数据采集:从仪器中获取测量数据。命令发送:向仪器发送控制命令。错误处理:处理通信过程中可能出现的错误。测试自动化是指通过编写脚本或程序来自动执行测试任务,从而提高测试效率和减少人为错误。Keysight的测试设备和仪器支持多种编程语言和开发环境,使得测试自动化变得相对容易。

2401_87715305的博客 1359

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[转载]vc文件操作 及 内存映射

转载地址:http://blog.chinaunix.net/uid-7820384-id-2556271.html 评读:本篇文章的内容量很大,介绍了基本的文件读写,ini文件的读写,并且介绍了比较有难度的内存映射,不明觉厉。       各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟

春夜喜雨的专栏 1412

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC++中使用内存映射文件处理大文件2(转载)

转载:http://blog.youkuaiyun.com/fan6662000/archive/2008/11/14/3302217.aspxVC++中使用内存映射文件处理大文件1 收藏 作者: 郎锐 出处:中国电波传播研究所 Create

wisage的专栏 985

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

内存映射文件原理探索

http://blog.youkuaiyun.com/yuanweihuayan/article/details/8074764这篇文章简单的讨论了虚拟内存的使用方式.其实和虚拟方式差不多的另一种内存分配方式是内存映射文件. 这两种方式给我的感觉主要的区别是一个在pagefile使用pagefile来缓存,一个使用磁盘(包括pagefile).   内存映射文件实际上是如何分配和使用的,核心编程讲的确实

sunliangyuan的专栏 1367

VC++ 中使用内存映射文件处理大文件

#include "stdafx.h" #include <windows.h> #include <iostream> using namespace std; string GetValue(const char* lpbMapAddress, const char* sName);int main() { HANDLE hFile = CreateFi...

weixin_34301132的博客 146

全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

转载自:http://blog.youkuaiyun.com/yeming81/article/details/2050521 本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++

Achelous的专栏 942

VC++6.0内存文件映射

VC++6.0内存文件映射(转载)   由于某种需要,很多时候可能需要对文件进行随机偏移读取和修改。一般情况下,可以先fseek到文件中制定的位置,再将文件块读入内存-修改-写回。对于大文件(GB量级),或者频繁的随机文件读写,这样的方式会非常耗费时间。 这类操作一般是以内存映射文件(即将文件映射到进程的某一块空间)的方式来加以处理的。使用内存映射文件处理存储于磁盘上的文件时,将不必

zhihu008的专栏 5823

从fread和mmap谈C++读文件的性能

(关于Linux读文件的更深入理解,猛戳这里吧)         在进行大规模数据处理时,读文件很有可能成为速度瓶颈。不管你的CPU有4个核还是8个核,主频有2G还是3G,硬盘IO速度总是有个上限的。在本人最近的一次经历中,对一个11G的文本进行数据处理,一共耗时34.8秒,其中竟然有30.2秒用在访问IO上,占了所有时间的87%左右。         虽然说硬盘IO是有上限的,那么C++

blog 1万+
上一篇: 【转载】C++文件操作详解(ifstrea…
下一篇: 【转载】对缓冲区的理解&nbsp;C++
wakeupwakeup
博客等级 码龄11年 9粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值