C++ 从文件中更快地读取数据

C++ 从文件中更快地读取数据,c++,c,pcap,libpcap,winpcap,C++,C,Pcap,Libpcap,Winpcap,我对文件中的seek有疑问 我有pcap文件,我需要寻找一个特定的数据包。到目前为止,这是我查找该数据包的代码: while (!find_the_packet) { pcap_next_ex(p_pcap, &header, &data); //read the next packet check_if_the_packet_found(); } 而且效果很好 我的目标是更快地找到那个数据包——在我找到它之前不要逐个检查数据包 所以我用(键,值)构建了数据库

我对文件中的seek有疑问

我有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_偏移量(pcapnav_t*pn,off_t偏移量,pcapnav_cmp_t边界)

我看到这个函数使用了FSEEK。所以我的数据库不是很有用,因为FSEEK是串行工作的(如果我错了,请纠正我)

所以我的问题是-

FSEEK真的连续工作吗?逐块阅读?它是如何工作的?我有点困惑

如果是这样,是否有更快的方法从pcap文件获取特定的数据包\数据块


感谢advanced。

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


如果您将要读取的文件小于可用RAM的大小,并且大多数情况下都是可用的,那么您将。在这种情况下,您还可以要求操作系统延迟预取文件(使用或)。如果文件大于可用RAM和/或偶尔访问,则读取速度将受到磁盘I/O的限制,使得seek+read和mmap之间的差异不明显。

是的,您错了,它所做的只是设置下一次读取/写入的位置,基本上,它只是一个变量赋值。尽管它可能取决于底层文件系统,但fseek(以及下面的读取)在现代实现中几乎是在固定时间内工作的。嗨,谢谢!这是我的困惑——假设该位置设置为文件中的特定点,比如说距离当前位置300MB。光标是否会立即到达下一个读写位置?在我非常简单的理解中,顺序读取512字节需要1次磁盘操作,而fseek到300MB偏移量加上读取512字节需要大约6次磁盘操作。当然,实际时间还受I/O缓存的实际状态的影响。感谢您的帮助!让我看看我是否理解你-如果可用RAM是512B,我想寻找5GB,操作系统是否会“获取”5GB\512B块(一块接一块),对它们不做任何处理,只有到那时-当它到达(5GB\512B)块时执行读取?我唯一能让它更快的机会是将文件内容加载到程序内存中,将它安排为映射(键、值),当我等待执行seek时,我将快速执行该操作(映射时间)?@user3378689不,文件系统不会按顺序扫描文件,它有一个映射,告诉它磁盘上的确切位置是5gb(参见)。不,如果文件大于可用RAM,则无法通过将文件加载到RAM中来提高速度。