更快地从文件中读取数据

Read data faster from files

本文关键字:读取 数据 文件      更新时间:2023-10-16

我对在文件中查找有疑问。

我有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文件中获得特定的数据包数据块?

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

如果您要读取的文件小于可用RAM的大小,并且大部分将被缓存,那么您将受益于映射它。在这种情况下,您还可以要求操作系统惰性预取文件(使用madvise或PrefetchVirtualMemory)。如果文件比可用的RAM大,并且/或者只是偶尔访问,那么读取速度将受到磁盘I/O的限制,使得seek+read和mmap之间的区别变得无关紧要。