如何在文件中有效地执行随机搜索?

时间:2018-05-24 04:52:18

标签: file filereader seek leveldb

我有一个存储在磁盘上的文件,并且记录以自定义记录格式写入文件。一堆记录将代表一个块。在磁盘中执行读取时,只能获取块而不是记录。

Block = physical record.
Data = logical record.

每个逻辑记录在文件中都有唯一的偏移量。它更接近leveldb的唱片格式。

考虑到一堆偏移量,您将如何有效地读取逻辑记录?

1 个答案:

答案 0 :(得分:0)

实际上,在大多数当前的操作系统和硬件上,无关紧要

阅读Operating Systems: Three Easy Pieces了解更多信息。

首先,操作系统维护page cache,其中包含最近读取或写入的页面。另见linuxatemyram。如此多的磁盘IO操作不是由硬件立即完成的,并且它们不是按您请求的顺序完成的。详细了解hard disk drive performance

然后,回想一下,越来越多的磁盘是SSD s(没有任何旋转延迟和持续的访问时间)。目前hard disk drive不使用CHSLBA,因此块地址不会立即与其物理位置相关(disk controller本身会处理映射)

在某些情况下,内核磁盘driverfile system会重新组织待处理的磁盘请求。

但是,您最好在足够大的缓冲区上执行磁盘IO (通常,至少每个read(2)write(2)都会有几页4K字节。< / p>

在Linux上,另请参阅sync(2)fsync(2)posix_fadvise(2)readahead(2)mmap(2)madvise(2)系统调用

  

鉴于一堆偏移量,您将如何有效地读取逻辑记录?

你可能会订购这些补偿,但这实际上不会发生很大变化,也可能根本不会变化。一定要做基准测试。

在实践中,请使用某些库,例如leveldbgdbm(索引文件)或sqlite。您可以调整一些参数(缓冲区大小),但您应该信任该库的其余部分。