VC 大檔案讀取

2021-10-18 16:24:47 字數 2533 閱讀 2116

個別時候,我們要讀取非常大的檔案,如 5gb 要把檔案讀出,再寫進,耗費的是cpu利用率與記憶體以及io的頻繁操作。這顯然是

令使用者難以忍受的

為了解決這個吃記憶體,佔cpu,以及io瓶頸,windows核心程式設計提供了記憶體對映檔案技術;

因為資料非常大,還要處理,我採用了,記憶體對映+執行緒池;

先看一下記憶體對映讀資料:

#include #include #include #include using namespace std;

string getvalue(const tchar *, const tchar *); //根據name得value

void main(int argc, char* ar**)

// 建立檔案對映物件

if (hfilemap == null)

// 得到系統分配粒度

system_info sysinfo;

getsysteminfo(&sysinfo);

dword dwgran = sysinfo.dwallocationgranularity;

// 得到檔案尺寸

dword dwfilesizehigh;

__int64 qwfilesize = getfilesize(hfile, &dwfilesizehigh);

qwfilesize |= (((__int64)dwfilesizehigh) << 32);

// 關閉檔案物件

closehandle(hfile);

// 偏移位址

__int64 qwfileoffset = 0;

// 塊大小

dword dwblockbytes = 1000 * dwgran;

if (qwfilesize < 1000 * dwgran)

dwblockbytes = (dword)qwfilesize;

if (qwfileoffset >= 0)

//-----------------------訪問資料開始-------------------------

cout《以上實現了根據索引name匹配value的簡單過程,經測試,同樣25w行檔案,匹配耗費1秒不到,且

不占本程序記憶體。

以上因為沒有直接使用讀入記憶體再處理的方式,大大節約了記憶體;再就是採用這種方式,減少了io,時間也大大減少;

但 5gb的資料,如果這樣讀加處理,還是要4分鐘左右;

所以我加上了執行緒池,這樣,最後的效果是 40秒左右,勉強可以接受;

void getfloatdatabypool(vtkpoints * points, char * filebuffer, int count, int jump)

; int index = 0;

double arr[3];

for (int j = 0; j < count * jump; j++)

for (int i = 0; i < jump; i++)

filebuffer = (char*)memchr((void*)filebuffer, '\n', 50);

filebuffer++;

points->insertpoint(index, arr[0], arr[1], arr[2]);

index++; }}

readptsbythreadpool()

//建立乙個檔案對映核心物件;

null,

page_readwrite,

0,0,

"resource ");

if (mapfileh == null)

//將檔案資料對映到程序的位址空間;

char * maph = (char *)mapviewoffile(mapfileh,

file_map_all_access,

0,0,

0);if (maph == null)

//讀取資料;

char *filebuffer = maph;

int times = atoi(filebuffer);//300000 * 34;

filebuffer = (char*)memchr((void*)filebuffer, '\n', 50);

filebuffer++;

int dividcount = times / 4;

std::futureft[4];

for (int s = 0; s < 4; s++)

for (int s = 3; s >=0; s--)

//for (int index = 0; index < dividcount * 4; index++)

// //points->insertpoint(index, arr[0], arr[1], arr[2]);

//index++;

//關閉控制代碼;

unmapviewoffile(maph);

closehandle(mapfileh);

closehandle(fileh);

}

完整**樣例:

python 讀取大檔案

以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...

php 讀取大檔案

在php中,對於檔案的讀取時,最快捷的方式莫過於使用一些諸如file file get contents之類的函式,簡簡單單的幾行 就能 很漂亮的完成我們所需要的功能。但當所操作的檔案是乙個比較大的檔案時,這些函式可能就顯的力不從心,下面將從乙個需求入手來說明對於讀取大檔案時,常用的操作方法。需求需...

python讀取大檔案

最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open 函式以及read 函式來完成 f open filename,r f.read 這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將乙個10g大小的日誌檔案讀取,即...