2014-05-11 51 views
1

我有關於在文件中查找的問題。從文件中更快地讀取數據

我有pcap文件,我需要尋找一個特定的數據包。到目前爲止,這是我的代碼找到該數據包:

while (!find_the_packet) 
{ 
    pcap_next_ex(p_pcap, &header, &data); //read the next packet 
    check_if_the_packet_found(); 
} 

它運作良好。

我的目標是更快地發現數據包 - 直到找到數據包才檢查數據包。

所以我建立了數據庫 - 哈希圖(key,value)。讓說,

key -> No. of the packet 
value -> the packet itself (or the location of the packet) 

我也注意到了pcapnav庫函數: pcapnav_goto_offset(pcapnav_t *pn, off_t offset, pcapnav_cmp_t boundary)

,我看到這個函數使用FSEEK。所以我的數據庫不是很有幫助,因爲FSEEK串行工作(糾正我,如果我錯了)。

所以我的問題-

是FSEEK真的串聯?按塊讀塊?它是如何工作的?我有點困惑..

如果是這樣,有沒有更快的方式從pcap文件獲取特定的數據包\大塊數據?

感謝先進。

+1

是的,你錯了['fseek'](http://en.cppreference.com/w/c/io/fseek),它所做的就是設置下一個讀/寫應該發生的位置,基本上它只是一個變量賦值。 –

+1

雖然它可能取決於底層文件系統,但fseek(和下面的讀取)被理解爲在現代實現中幾乎在恆定時間內工作。 – Marian

+0

嗨,謝謝!這是我的困惑 - 假設位置被設置爲文件內的特定點,可以說從當前位置開始是300MB。光標是否會立即進入下一個讀取\寫入位置? – user3378689

回答

2

Fseek只會告知底層庫(libc)下一次讀取的位置。然後Libc將請求轉發給操作系統(通常使用系統調用lseek)。因此,爲了讀取給定的位置,您有兩個系統調用(lseek,read)和一個副本(讀取從文件系統緩衝區(也稱爲cache)到您程序的地址空間)。

如果您要讀取的文件小於可用RAM的大小,並且主要是cached,那麼您將benefit from mmap-ing it。在這種情況下,您還可以要求操作系統延遲預取文件(使用madvisePrefetchVirtualMemory)。如果文件大於可用RAM和/或偶爾訪問,則讀取速度將受到磁盤I/O的限制,從而使seek + read和mmap之間存在差異。

+0

感謝您的幫助!讓我看看我是否理解你 - 如果可用RAM是512B,並且我想尋求5GB,操作系統是否會「佔用」5GB/512B塊(塊大塊),對它們什麼也不做,只有當 - 它到達(5GB \ 512B)塊執行讀取? – user3378689

+0

我唯一的機會就是將文件的內容加載到程序的內存中,將其排列到MAP(key,value),當我執行seek時,我會做很快的變化(MAP time)嗎? – user3378689

+0

@ user3378689不,文件系統不會按順序掃描文件,它有一張地圖,告訴它磁盤上的確切位置是5gb(參見http://en.wikipedia.org/wiki/Inode_pointer_structure)。不,如果文件大於可用RAM,則無法通過將文件加載到RAM中來提高速度。 – ArtemGr