搬:C++采用内存映射方式高效率读写大数据

    xiaoxiao2023-10-17  166

    C++采用内存映射方式高效率读写大数据

    2016年08月12日 16:09:22 oceanperfect 阅读数:10658

    https://blog.csdn.net/oceanperfect/article/details/52192602

           在有时候,项目的数据量特别大,而且源源不断的到来,这个时候,利用传统的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 = "\n";

     

    /* 获取文件大小和数据长度 */

    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,"\0",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>

     

     

    最新回复(0)