個別時候,我們要讀取非常大的檔案,如 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大小的日誌檔案讀取,即...