Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 高性能读取-linux/pthreads_C_Linux - Fatal编程技术网

C 高性能读取-linux/pthreads

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

我有一个中等大小的二进制文件,由如下独立块组成:

header1 data1 header2 data2 header3 data3 ... 校长1 数据1 校长2 数据2 校长3 数据3 ... 块的数量、每个块的大小和文件的总大小差别很大,但典型的数字是~1000个块,平均块大小为100kb。这些文件是由一个我无法控制的外部应用程序生成的,但我想尽快读取它们。在许多情况下,我只对一小部分(即10%)的块感兴趣,这就是我将优化的情况

我当前的实现如下所示:

header1 data1 header2 data2 header3 data3 ...
  • 打开文件并读取所有标题-使用标题中的信息将fseek()读取到下一个标题位置;保留一个打开的文件*指针
  • 当请求数据时,使用fseek()定位数据块,读取所有数据并返回
  • 这很好-但我想也许(?)有可能使用aio、mmap或其他我只听说过的技术来加快速度

    有什么想法吗


    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
    技巧。。。你会惊讶的。。。但我真的觉得你太担心了。。。