我对搜索文件有疑问。
我有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文件获取特定的数据包\数据块?
先谢谢。
答案 0 :(得分:2)
Fseek只告诉底层库(libc)下一次读取应该发生的位置。然后,Libc会将请求转发给操作系统(通常使用lseek系统调用)。因此,为了在给定位置读取,您有两个系统调用(lseek,read)和一个副本(读取从文件系统缓冲区(又名cache)到程序的地址空间)。 / p>
如果您要阅读的文件小于可用内存的大小,并且大部分时间为cached,那么您需要benefit from mmap-ing it。在这种情况下,您还可以要求操作系统懒惰地预取文件(使用madvise或PrefetchVirtualMemory)。如果文件大于可用RAM和/或偶尔访问,那么读取速度将受到磁盘I / O的限制,使得seek + read和mmap之间没有区别。