从文件中更快地读取数据

时间:2014-05-11 08:35:54

标签: c++ c pcap libpcap winpcap

我对搜索文件有疑问。

我有pcap文件,我需要寻找特定的数据包。到目前为止,这是我找到该数据包的代码:

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

它运作良好。

我的目标是更快地找到数据包 - 在找到之前不逐包检查。

所以我用(键,值)构建了数据库 - 哈希映射。

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 个答案:

答案 0 :(得分:2)

Fseek只告诉底层库(libc)下一次读取应该发生的位置。然后,Libc会将请求转发给操作系统(通常使用lseek系统调用)。因此,为了在给定位置读取,您有两个系统调用(lseek,read)和一个副本(读取从文件系统缓冲区(又名cache)到程序的地址空间)。 / p>

如果您要阅读的文件小于可用内存的大小,并且大部分时间为cached,那么您需要benefit from mmap-ing it。在这种情况下,您还可以要求操作系统懒惰地预取文件(使用madvisePrefetchVirtualMemory)。如果文件大于可用RAM和/或偶尔访问,那么读取速度将受到磁盘I / O的限制,使得seek + read和mmap之间没有区别。