我有一个中等大小的二进制文件,由如下独立块组成:
头1
数据1
头2
数据2
头3
数据3
…
块的数量、每个块的大小和文件的总大小变化很大,但典型的数字是~1000个块,平均块大小为100kb。这些文件是由一个我无法控制的外部应用程序生成的,但我想尽快读取它们。在许多情况下,我只感兴趣的一小部分(即10%)的块,这是我将优化的情况。
我目前的实施方式如下:
打开文件并读取所有的头-使用头中的信息到fseek()到下一个头位置;保留一个打开的文件*指针。
当请求数据时,使用fseek()定位数据块,读取所有数据并返回。
这工作很好-但我想也许(?)有可能使用aio、mmap或其他我只听说过的技术来加快速度。
有什么想法吗?
乔金
最佳答案
大部分时间可能花在访问磁盘上。所以也许买一个固态硬盘是明智的。(无论您做什么,您的应用程序都是I/O绑定的)。
显然,你的文件只有大约100MB。你可以在磁盘(内核文件)缓存中读取它,例如在运行程序之前使用cat yourfile > /dev/null
。对于这样一个小的文件(在一个合理的机器上,它适合ram),我不会那么担心。
您可以预先处理文本文件,例如创建一个数据库(用于sqlite,或者像postgresql这样的真实rdbms)或者一个gdbm索引文件。
如果使用<stdio.h>
您可能有一个更大的缓冲区setbuffer,或者使用"rmt"
模式调用fopen(m
是一个gnu glibc扩展,用于请求它)。
您可以将mmap与madvise一起使用。
您可以(可能在单独的线程中)使用readahead系统调用。
但是你的文件看起来很小,你不应该那么麻烦。你确定这真的是性能问题吗?你是每天读几千次那个文件,还是有几百个这样的文件?