gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:33 26 4
gpt4 key购买 nike

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

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

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

而且效果很好。

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

所以我用(键,值)构建了数据库 - HashMap 。让我们说

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

我还注意到 pcapnav 库函数: pcapnav_goto_offset(pcapnav_t *pn,off_t 偏移量,pcapnav_cmp_t 边界)

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

所以我的问题-

FSEEK 真的可以连续工作吗?逐 block 读取?它是如何工作的?我有点困惑..

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

提前致谢。

最佳答案

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

如果您要读取的文件小于可用 RAM 的大小,并且大部分是 cached那么你会benefit from mmap-ing it .在这种情况下,您还可以要求操作系统延迟预取文件(使用 madvisePrefetchVirtualMemory )。如果文件大于可用 RAM 和/或偶尔访问,则读取速度将受到磁盘 I/O 的限制,从而使 seek+read 和 mmap 之间的区别变得微不足道。

关于c++ - 更快地从文件中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com