C 高性能读取-linux/pthreads
我有一个中等大小的二进制文件,由如下独立块组成: header1 data1 header2 data2 header3 data3 ... 校长1 数据1 校长2 数据2 校长3 数据3 ... 块的数量、每个块的大小和文件的总大小差别很大,但典型的数字是~1000个块,平均块大小为100kb。这些文件是由一个我无法控制的外部应用程序生成的,但我想尽快读取它们。在许多情况下,我只对一小部分(即10%)的块感兴趣,这就是我将优化的情况 我当前的实现如下所示: header1 data1 header2 data2 header3 data3 ...C 高性能读取-linux/pthreads,c,linux,C,Linux,我有一个中等大小的二进制文件,由如下独立块组成: header1 data1 header2 data2 header3 data3 ... 校长1 数据1 校长2 数据2 校长3 数据3 ... 块的数量、每个块的大小和文件的总大小差别很大,但典型的数字是~1000个块,平均块大小为100kb。这些文件是由一个我无法控制的外部应用程序生成的,但我想尽快读取它们。在许多情况下,我只对一小部分(即10%)的块感兴趣,这就是我将优化的情况 我当前的实现如下所示: header1 data1 head
Joakim大部分时间可能都花在访问磁盘上。因此,或许购买SSD是明智的。(无论您做什么,您的应用程序都受I/O限制) 显然,您的文件只有大约100Mb。您只需在运行程序之前,使用
cat yourfile>/dev/null
读取它,就可以在磁盘(内核文件)缓存中获取它。对于这样一个小文件(在一台合理的机器上,它适合RAM),我不会太担心
您可以对文本文件进行预处理,例如,创建一个数据库(用于,或像PostGreSQL这样的真正的RDBMS)或只是一个索引文件
如果使用
您可能会有一个更大的缓冲区,或者使用的“rmt”
模式调用(m
是一个GNU Glibc扩展,用于询问mmap
-ing它)
你可以用它
您可以(可能在单独的线程中)使用系统调用
但是您的文件似乎足够小,您不应该太麻烦。你确定这真的是一个性能问题吗?您是否每天读取该文件数千次,或者您有数百个这样的文件?mmap和read之间的速度差不是很大(都需要从磁盘读取数据),mmap的最大优点是避免了双缓冲
如果你只对10%的内容感兴趣,那么你最大的节省就是不阅读其他90%的内容。这可以通过只读取头并查找下一个头或所需的数据块来完成。但这一切都取决于文件格式,OP没有详细显示。谢谢-我将研究mmap+madvise和readahead系统调用,我不知道这些调用;但是你是对的——也许性能已经足够好了。首先,试试猫的
cat
技巧。。。你会惊讶的。。。但我真的觉得你太担心了。。。