C++采用内存映射方式高效率读写大数据
在有时候,项目的数据量特别大,而且源源不断的到来,这个时候,利用传统的IO文件流写文件势必效率很低跟不上节奏。我这里的场景是:生存者A,消费者B,消息队列C。A高速生产数据并缓存至C,B不停的从C取数据,并写入本地文件。不妨采用内存映射方式来写文件,达到高效,至于相比于传统IO能够快多少,可以作个比较,我这边两者差距特别大。关于mmap的相关API,请参阅网上其他地方,这里不再敖述。直接贴例子代码。
<span style="font-family:Courier New;font-size:14px;">#include<sys/mman.h> #include<sys/types.h> #include<fcntl.h> #include<string.h> #include<stdio.h> #include<unistd.h> #include <string> #include <iostream> using namespace std; /* 获取要写入文件的长度 */ int getFileSize(const string &filename) { int size = 0; FILE *fp = NULL; fp=fopen(filename.c_str(),"r"); if( NULL == fp) { return size; } fseek(fp,0L,SEEK_END); size = ftell(fp); fclose(fp); return size; } void mmapSaveDataIntoFiles(const string &filename,const string &data) { int fileLength = 0; int dataLength = 0; int offset = 0; string nextLine = " "; /* 获取文件大小和数据长度 */ fileLength = getFileSize(filename); dataLength = data.length() + 1; offset = fileLength + dataLength; int fd = open(filename.c_str(),O_CREAT |O_RDWR|O_APPEND,00777); if(fd < 0) { cout<<"OPEN FILE ERROR!"<<endl; } /* 增大文件大小,以用于映射 */ lseek(fd,0,SEEK_END); write(fd," ",dataLength); /* 建立映射 */ char *buffer = (char*)mmap(NULL,offset,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); close(fd); /* 清零该段内存,防止乱码 */ memset(buffer + offset,0,dataLength); /* 写入数据 */ memcpy(buffer + fileLength,data.c_str(),dataLength - 1); /* 增加换行符 */ memcpy(buffer + offset - 1,nextLine.c_str(),nextLine.length()); munmap(buffer,offset); } int main() { string data = "123456789"; int i = 0; while(i < 1000) { mmapSaveDataIntoFiles("data",data); i++; } return 0; }</span>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 微信开发之扫码支付
- 下一篇: JAVA微信扫码支付模式二功能实现以及回调