由于用到的txt存放的数据有几十万行,用getline来读取文件非常慢,搜索了一下可以来优化读取文件的方法。

据说用内存映射读取文件速度快,试了一下,但是发现要分行处理数据时,速度还是挺慢的。

有关内存映射的介绍,参考别人博客。

http://blog.csdn.net/wcyoot/article/details/7363393

/
///创建镜像文件来读取文件,提高速度
///
void useMapFileReadText(){
HANDLE hFile = NULL, hFileMap = NULL;
char * lpbMapAddress = NULL;
int nFileSize = 0, nLeftSize = 0;
if(hFile == NULL)
{
hFile = CreateFile("data.txt", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
printf("打开文件失败");
}
}
if(hFileMap == NULL)
{
hFileMap=CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if(hFileMap==NULL)
{
OutputDebugString("文件镜像句柄创建失败!");
CloseHandle(hFile);
}
}
if(lpbMapAddress == NULL)
{
lpbMapAddress = (char *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
if(lpbMapAddress == NULL)
{
OutputDebugString("内存映射文件失败!");
CloseHandle(hFileMap);
CloseHandle(hFile);
}
}
const char* buf = lpbMapAddress;
const char* start = lpbMapAddress;
int len;
while(start != NULL){
start = _get_line(buf, &len);
string str(buf,len);
//do something with str
buf = start;
}
//释放
UnmapViewOfFile(hFile);
CloseHandle(hFileMap);
}

其中的,_get_line 函数

'\n' 在windows中为0x0d 0x0a 占两个字符,在linux系统中为0x0a占一个字符。

//buf:从当前地址开始搜索。
//len: 存放该行的字符串长度,不包含回车换行符。
//返回值:下一次搜索开始的地址.如果到达文件尾,则返回NULL
const char* _get_line(const char* buf, int* len)
{
const char* tmp = buf;
while(*tmp && (*tmp != 0x0d && *tmp != 0x0a && *tmp != '\n')) ++tmp;
//while(*tmp && (*tmp != 0x0d || *tmp != 0x0a )) ++tmp;
*len = tmp - buf; //
if (*tmp == 0) return NULL;
// skip New-Line char
if (*tmp == 0x0d){ // Windows style New-Line 0x0d 0x0a
tmp += 2;
//assert(*tmp == 0x0a);
}//else Unix style New-Line 0x0a
else{
++tmp;
}
return tmp;
}

用十三万多行来测试,这样按行来处理时,不如getiline速度快。

内存映射的优势还是在于大文件。

fstream.open() 时,由于文件太大,IO一次读不了所有的数据,需要多次IO操作。

而内存映射,并不是将文件加载到内存。内存映射首先申请一段地址空间,并映射到物理存储器,而这里的物理存储器就是文件所在的磁盘,类似虚拟内存(pagefile);
当有需要时,程序不需要先把它加到内存,而是直接从磁盘读取。这样就减少了IO操作。

内存映射的一个优势还在于多个进程之间共享数据。

c++ 利用内存映射读取大文件相关推荐

  1. 分块内存映射处理大文件-例子

    参考 :http://user.qzone.qq.com/382164370/infocenter#!app=2&via=QZ.HashRefresh&pos=1363445766 内 ...

  2. java 提交的内存_Java使用内存映射实现大文件的上传

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...

  3. 内存映射处理大文件[转载]

    首先通过GetFileSize()得到被处理文件长度(64位)的高32位和低32位值.然后在映射过程中设定每次映射的块大小为1000倍的分配粒度(系统的数据分块大小),如果文件长度小于1000倍的分配 ...

  4. Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑". 笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. r ...

  5. python读取大文件的坑_Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  6. python读取视频占用内存太大_Python 读取大文件内存占用检测示例

    导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...

  7. Python读取大文件的坑与内存占用检测

    Python读取大文件的"坑"与内存占用检测 1.read()与readlines() with open(file_path, 'rb') as f:sha1Obj.update ...

  8. Java高效读取大文件

    1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...

  9. Java高效读取大文件(转)

    Java高效读取大文件 1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础&quo ...

最新文章

  1. 【开放书】《命令行数据科学指南(第二版)》
  2. Java基础:异常机制
  3. 如何安全的在不同工程间安全地迁移asset数据?三种方法
  4. pymysql语法_pymysql的用法
  5. Python中超类是如何知道自己被继承的
  6. YouTube 多目标排序系统:如何推荐接下来收看的视频
  7. java main传入参数_向java的main()传入大量参数
  8. NYOJ--71--独木舟上的旅行
  9. 小编详解网络蜘蛛的安全隐患及预防方法
  10. 52_LSTM及简介,RNN单元的内部结构,LSTM单元的内部结构,原理,遗忘门,输入门,输出门,LSTM变体GRU,LSTM变体FC-LSTM,Pytorch LSTM API介绍,案例(学习笔记)
  11. linux4 系统下载,SysLinux 4.0.4 下载
  12. WhatsApp群发系统-SendWS拓客系统功能后台介绍(五):WhatsApp筛号群发,群发超链
  13. 文件的打开方式怎么用计算机,电脑怎样修改文件默认打开方式
  14. Flink Back Pressure(背压)实现与监控
  15. 第一代GCN: Spectral Networks and Locally Connected Networks on Graphs
  16. wr720n刷成网络打印_方便实用!教你如何简单把 usb打印机改成无线打印机!
  17. Vue 3.0 这个迷人的小妖精,到底好在哪里?
  18. 富文本编辑器 Kindeditor 的使用和 常见错误
  19. 纯css实现div背景色从左到右的刷动效果
  20. 兰州财经大学计算机网络,兰州财经大学教务网络管理系统入口

热门文章

  1. 亿级别记录的mongodb批量导入Es的java代码完整实现
  2. MySQL慢查询日志总结
  3. 量化派基于Hadoop、Spark、Storm的大数据风控架构--转
  4. Java Garbage Collection Basics--转载
  5. Understanding CMS GC Logs--转载
  6. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
  7. Linux ps aux指令詳解--转
  8. Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载
  9. webp app推荐图片格式,更小更快减少oom
  10. 大数据分析工资单:六大行员工再涨薪 人均年薪超26万