2013-05-06 84 views
0

我真的很大的文件,其中包含數據包。文件本身就是一個非常大的字符串,並且這些軟件包與一個字符串「PACK1.0」分開。什麼是遍歷C++中的大文件的好方法

假設「XXX」是數據包看起來像這樣:

PACK1.0XXXXXXXXXXXXXXXXXPACK1.0XXXXXXXXXXXXXXPACK1.0XXXXXXXXXX 

我創建一個哈希映射,其中包含包的地方開始的字節數,和。

例子:

PACKAGE NR | BYTE WHERE IT BEGINS IN THE STREAM 
0 | 0 
1 | 128 
2 | 256 
. | . 
. | . 

如果我想包號5340,我看在哪個字節包開始,去與stream.seekg(位置)字節的HashMap和分析數據包,在理論上。

我的最後一個問題是:我要出差槽採用了滑蓋的文件,具有播放暫停&選項。我的想法是滑塊具有min = 0和max = packagecount範圍。

這是遍歷文件的好方法嗎?

這會導致什麼問題?有什麼更好的方法來做到這一點?

這是我的用於存儲的散列映射代碼(該代碼假設一個包是128字節長):

std::map<int, int> THEMAP; 

    thefile.seekg(0,std::ios::end); 
    dataLength=thefile.tellg(); 
    thefile.seekg(0,std::ios::beg); 

    while(position<dataLength) 
    { 
    thefile.seekg(0,position); 
    position=position+128; 
    packagecount++; 
    THEMAP.insert(std::make_pair(packagecount,position)); 
    } 
+2

考慮到包號是從零開始的連續整數,數組或向量聽起來比散列映射更合適。 – 2013-05-06 20:01:53

+2

更不用說,如果你的軟件包尺寸完全相同,並且提前知道尺寸,則不需要保留地圖。您可以將包裝大小乘以包裝編號。 – OlivierD 2013-05-06 20:20:21

+0

實際上,大小可能會改變..我可以使用本地文件,但也可以通過TCP在網絡上檢索數據。 – Amazonasmann 2013-05-06 20:25:15

回答

0

這是usuually內存映射-10(MMIO)的情況。如果您只是Windows,請使用MapViewOfFile以及該系列中的其他功能。對於跨平臺的使用,我建議glib的file map functions。 MMIO所做的是將文件的一部分(或整個文件)映射到進程的內存空間,以便通過簡單的指針訪問它。您可以任意確定文件的哪個部分以及它的大小。

爲你的可能的策略可能是因爲你,在啓動時,該文件的一個固定塊映射到內存在一個循環中,逐塊),並搜索在每個塊中的第一個包IDENTIFER。這相對較快,併爲您提供第一組標記。在下次訪問時,您可以使用此初始設置找到文件的正確部分,映射此文件並僅掃描此部分。當然,你會存儲任何標記。

後來,當你通過你的文件,你剛纔映射滾動頁面(可能是較小的這段時間,這取決於你有多少數據需要在某一個時間點),並顯示所需要的數據。顯然,包標記的地址可以同時用作內存映射的起始地址。

尼斯的副作用是,它是完全不相干的包是什麼尺寸,你可以映射任何大小的文件,甚至技嘉大小的文件。通過使用文件的小視圖,應用程序的內存需求可以非常小。

相關問題