【问题标题】:How to efficiently perform random seeks in a file?如何有效地在文件中执行随机搜索?
【发布时间】:2018-05-24 04:52:18
【问题描述】:

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

Block = physical record.
Data = logical record.

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

给定一堆偏移量,你将如何有效地读取逻辑记录?

【问题讨论】:

  • 这是作业吗?你的实际应用是什么?什么操作系统、文件系统、文件大小?为什么是leveldb 标签?在您的问题中显示一些minimal reproducible example

标签: file filereader seek leveldb


【解决方案1】:

实际上,在大多数当前的操作系统和硬件上,这并不重要

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

首先,操作系统维护一个page cache,其中包含最近读取或写入的页面。另见linuxatemyram。这么多磁盘 IO 操作不是由硬件立即完成的,也不是按照你要求的顺序完成的。阅读有关hard disk drive performance 的更多信息。

然后,回想一下,越来越多的磁盘是SSDs(没有任何旋转延迟和恒定的访问时间)。而当前的hard disk drives 不使用CHS,而是使用LBA,因此块地址与其物理位置没有直接关系(disk controller 本身处理映射)。

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

但是,您最好在足够大的缓冲区上进行磁盘 IO(通常,每个 read(2)write(2) 至少有几页 4Kbytes)。

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

给定一堆偏移量,你将如何有效地读取逻辑记录?

您可以订购这些偏移量,但这实际上不会有太大变化,可能根本不会。请务必进行基准测试。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多