首页 > 解决方案 > 如何有效地在文件中执行随机搜索?

问题描述

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

Block = physical record.
Data = logical record.

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

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

标签: filefilereaderseekleveldb

解决方案


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

阅读操作系统:三个简单的部分了解更多信息。

首先,操作系统维护一个页面缓存,其中包含最近读取或写入的页面。另请参阅linuxatemyram。这么多磁盘 IO 操作不是由硬件立即完成的,也不是按照你要求的顺序完成的。阅读有关硬盘驱动器性能的更多信息。

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

在某些情况下,内核磁盘驱动程序文件系统会重新组织待处理的磁盘请求。

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

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

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

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

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


推荐阅读