c++ 利用内存映射读取大文件
由于用到的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++ 利用内存映射读取大文件相关推荐
- 分块内存映射处理大文件-例子
参考 :http://user.qzone.qq.com/382164370/infocenter#!app=2&via=QZ.HashRefresh&pos=1363445766 内 ...
- java 提交的内存_Java使用内存映射实现大文件的上传
在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...
- 内存映射处理大文件[转载]
首先通过GetFileSize()得到被处理文件长度(64位)的高32位和低32位值.然后在映射过程中设定每次映射的块大小为1000倍的分配粒度(系统的数据分块大小),如果文件长度小于1000倍的分配 ...
- Python读取大文件的坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑". 笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. r ...
- python读取大文件的坑_Python读取大文件的坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
- python读取视频占用内存太大_Python 读取大文件内存占用检测示例
导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...
- Python读取大文件的坑与内存占用检测
Python读取大文件的"坑"与内存占用检测 1.read()与readlines() with open(file_path, 'rb') as f:sha1Obj.update ...
- Java高效读取大文件
1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础"系列教程的一部分. ...
- Java高效读取大文件(转)
Java高效读取大文件 1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung(http://www.baeldung.com/) 上"Java--回归基础&quo ...
最新文章
- 【开放书】《命令行数据科学指南(第二版)》
- Java基础:异常机制
- 如何安全的在不同工程间安全地迁移asset数据?三种方法
- pymysql语法_pymysql的用法
- Python中超类是如何知道自己被继承的
- YouTube 多目标排序系统:如何推荐接下来收看的视频
- java main传入参数_向java的main()传入大量参数
- NYOJ--71--独木舟上的旅行
- 小编详解网络蜘蛛的安全隐患及预防方法
- 52_LSTM及简介,RNN单元的内部结构,LSTM单元的内部结构,原理,遗忘门,输入门,输出门,LSTM变体GRU,LSTM变体FC-LSTM,Pytorch LSTM API介绍,案例(学习笔记)
- linux4 系统下载,SysLinux 4.0.4 下载
- WhatsApp群发系统-SendWS拓客系统功能后台介绍(五):WhatsApp筛号群发,群发超链
- 文件的打开方式怎么用计算机,电脑怎样修改文件默认打开方式
- Flink Back Pressure(背压)实现与监控
- 第一代GCN: Spectral Networks and Locally Connected Networks on Graphs
- wr720n刷成网络打印_方便实用!教你如何简单把 usb打印机改成无线打印机!
- Vue 3.0 这个迷人的小妖精,到底好在哪里?
- 富文本编辑器 Kindeditor 的使用和 常见错误
- 纯css实现div背景色从左到右的刷动效果
- 兰州财经大学计算机网络,兰州财经大学教务网络管理系统入口
热门文章
- 亿级别记录的mongodb批量导入Es的java代码完整实现
- MySQL慢查询日志总结
- 量化派基于Hadoop、Spark、Storm的大数据风控架构--转
- Java Garbage Collection Basics--转载
- Understanding CMS GC Logs--转载
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
- Linux ps aux指令詳解--转
- Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制--转载
- webp app推荐图片格式,更小更快减少oom
- 大数据分析工资单:六大行员工再涨薪 人均年薪超26万