1. 程式人生 > >C++採用記憶體對映方式高效率讀寫大資料

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 = "\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>



相關推薦

C++採用記憶體對映方式高效率資料

       在有時候,專案的資料量特別大,而且源源不斷的到來,這個時候,利用傳統的IO檔案流寫檔案勢必效率很低跟不上節奏。我這裡的場景是:生存者A,消費者B,訊息佇列C。A高速生產資料並快取至C,B不停的從C取資料,並寫入本地檔案。不妨採用記憶體對映方式來寫檔案,達到高效

c# 採用BIT-map 方式,從一堆資料中,找出不重複的

採用的是bit-map演算法,關於什麼是bit-map,百度一下; 直接上一段程式碼,用C#改寫的! 如下:  class Program     {         private static int[] flags = new int[1000000];    

C/C++快速磁碟資料的方法-塊讀取/非同步/優化分析演算法/記憶體檔案對映的原理和使用

快速讀寫磁碟資料的方法: 1.塊讀取:一下子將資料讀取到記憶體的(無論是文字還是二進位制),而不是一行行的讀取。 2.非同步的IO,建立多執行緒,或者使用重疊IO,IO複用,非同步的事件回撥通知機制(可以用事件物件,訊號驅動來實現)。 3.優化分析檔案的演算法和儘量延後分析,分析演算法裡

C語言二進位制方式檔案資料

fwrite(buffer, size, count,fp):以二進位制的形式向指定的檔案中寫入若干資料項(由count決定),返回實際寫入的資料項數目,各引數含義如下: buffer:一個儲存區的起始地址,以該地址開始的儲存區的資料即是儲存到檔案中的資料,可以是陣列或指標型別; siz

Matlab 與 c++對txt 文檔的格式

space 控制臺 描述 col 什麽 let 數據 ret open 學習g++能夠讀取什麽格式的txt文件。 讀基本指令: >sprintf(filename, "doc_%d.txt", d); >fi

C++ 對TXT 的串並行

c++ index word 並行 div logs 實現 單詞數 能夠 任務說明:有36篇文檔,現在要讀入,並統計詞頻,字典長度25,希望能夠比較串並行讀寫操作的時間差距。 串行讀入並統計詞頻 // LoadDocsInUbuntu.cpp // #inc

[轉]C#對文本文件的(轉)

eve nextline reader 操作系統 為我 reat ini toe http 原網頁:http://www.cnblogs.com/infly123/archive/2013/05/18/3085872.html 計算機在最初只支持ASCII編碼,但是後來為了

C語言學習系列——文件操作詳解

記錄 源程序 8.4 lib 令行 stdio.h 空串 表示 參數 當文件按指定的工作方式打開以後,就可以執行對文件的讀和寫。下面按文件的性質分類進行操作。針對文本文件和二進制文件的不同性質,對文本文件來說,可按字符讀寫或按字符串讀寫;對二進制文件來說,可進行

c/c++ 多執行緒 boost的(reader-writer)鎖

多執行緒 boost的讀寫(reader-writer)鎖 背景:保護很少更新的資料結構時,c++標準庫沒有提供相應的功能。 例如:有個DNS條目快取的map,基本上很少有更新,大部分都是讀取,但是偶爾也會有更新,這種情況下,如果在讀取的函式里加上std::mutex就過於悲觀了,每次只能有一個執行緒讀取

c++ premier Plus書--C++列舉和switch, cin/cout/檔案

C++中switch和列舉結合使用: #include "iostream" using namespace std; // 建立一個列舉型別常量, 實際對應的是0~2 enum {red, orange, yellow}; int main() { cout << "Ente

C語言以字串的形式檔案

C語言以字串的形式讀寫檔案 fgetc() 和 fputc() 函式每次只能讀寫一個字元,速度較慢;實際開發中往往是每次讀寫一個字串或者一個數據塊,這樣能明顯提高效率。 讀字串函式fgets fgets() 函式用來從指定的檔案中讀取一個字串,並儲存到字元陣列中,它的原型為: c

C++標準庫實現WAV檔案

在上一篇文章RIFF和WAVE音訊檔案格式中對WAV的檔案格式做了介紹,本文將使用標準C++庫實現對資料為PCM格式的WAV檔案的讀寫操作,只使用標準C++庫函式,不依賴於其他的庫。 WAV檔案結構 WAV是符合RIFF標準的多媒體檔案,其檔案結構可以如下: WAV

java併發-Synchronized+CAS方式實現

Synchronized+CAS方式實現讀寫鎖 文章目錄 Synchronized+CAS方式實現讀寫鎖 思路 技術 程式碼 測試 結果 [GitHub主頁](https://gith

C++】記憶體管理方式

本篇博文旨在介紹C++的記憶體管理方式,並和C語言中的記憶體管理方式作出對比;說明了C語言中的malloc/free和C++中的new/delete的區別;介紹了定位new表示式,來模擬實現new和d

[C/C++標準庫]_[初級]_[中文路徑的檔案--寫入unicode字串]

場景: 1. 需要寫入非ascii文字並且與本地編碼無關時,除了utf8,unicode編碼是另外一個選擇,它的好處是佔兩個位元組,便於統計字元和對字元進行處理,因為有對應的寬位元組的函式,如wcslen. 2.使用_wfopen支援中文路徑. 程式碼1,寫入二進位制值:

C#-MemoryMappedFile的使用可以同時

               string fileName = AppDomain.CurrentDomain.BaseDirectory + "test.txt";       &nbs

C語言記憶體分配方式及malloc,realloc,calloc,alloc.free函式

C語言跟記憶體分配方式   (1) 從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。   (2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元

無鎖程式設計:c++11基於atomic實現共享鎖(優先)

在多執行緒狀態下,對一個物件的讀寫需要加鎖,基於CAS指令的原子語句可以實現高效的執行緒間協調。關於CAS的概念參見下面的文章: 在c++11中CAS指令已經被封裝成了 非常方便使用的atomic模板類, 詳情參見: 以下程式碼利用atomic實現了

c#實現記憶體對映檔案共享記憶體

記憶體對映檔案是利用虛擬記憶體把檔案對映到程序的地址空間中去,在此之後程序操作檔案,就像操作程序空間裡的地址一樣了,比如使用c語言的 memcpy等記憶體操作的函式。這種方法能夠很好的應用在需要頻繁處理一個檔案或者是一個大檔案的場合,這種方式處理IO效率比普通IO效率要高

使用C++檔案流庫fstream,操作十六進位制文字檔案

最近為智慧移動小車編寫上位機軟體的過程中,遇到了檔案讀寫處理的任務,檔案是一般的文字檔案.txt格式的,其內容由十六進位制資料組成。檔案內資料的格式如下: FF FD 03 FD 77 FE 77 1C 27 FF FD 01 FE 00 FE 00 1E 28 FF FE