file - 如何有效地在文件中执行随机搜索?
问题描述
我有一个存储在磁盘上的文件,并且记录以自定义记录格式写入文件。一堆记录将代表一个块。当您在磁盘中执行读取时,您只能获取一个块而不是一条记录。
Block = physical record.
Data = logical record.
每个逻辑记录在文件中都有一个唯一的偏移量。它更接近于 leveldb 的记录格式。
给定一堆偏移量,你将如何有效地读取逻辑记录?
解决方案
实际上,在大多数当前的操作系统和硬件上,这并不重要。
阅读操作系统:三个简单的部分了解更多信息。
首先,操作系统维护一个页面缓存,其中包含最近读取或写入的页面。另请参阅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)系统调用
给定一堆偏移量,你将如何有效地读取逻辑记录?
您可以订购这些偏移量,但这实际上不会有太大变化,可能根本不会。一定要进行基准测试。
在实践中,使用一些库,如leveldb或gdbm(索引文件)或sqlite。您可以调整一些参数(缓冲区大小),但您应该相信库的其余部分。
推荐阅读
- angular - How to change template in Angular dynamically?
- arrays - 如何从两个数组中所有元素的乘积创建矩阵?
- c# - Graphics.CopyFromScreen() 正在为特定应用程序捕获空白
- c++ - 如何在 python 中使用 cv::Mat?
- java - 使用 java 11 编译 cumulocity-clients-java 时出错
- sql - oracle sql dev,使用子查询,列出用户不感兴趣的建筑物
- javascript - e.parameter 中的参数未定义
- vue.js - Vuex 状态没有更新,state.dispatch 没有被调用
- java - 无法使用中国国家/地区的伪造者生成正确的数据
- python - 计算每个类别的贡献