我有一个存储在磁盘上的文件,并且记录以自定义记录格式写入文件。一堆记录将代表一个块。在磁盘中执行读取时,只能获取块而不是记录。
Block = physical record.
Data = logical record.
每个逻辑记录在文件中都有唯一的偏移量。它更接近leveldb的唱片格式。
考虑到一堆偏移量,您将如何有效地读取逻辑记录?
答案 0 :(得分:0)
实际上,在大多数当前的操作系统和硬件上,无关紧要。
阅读Operating Systems: Three Easy Pieces了解更多信息。
首先,操作系统维护page cache,其中包含最近读取或写入的页面。另见linuxatemyram。如此多的磁盘IO操作不是由硬件立即完成的,并且它们不是按您请求的顺序完成的。详细了解hard disk drive performance。
然后,回想一下,越来越多的磁盘是SSD s(没有任何旋转延迟和持续的访问时间)。目前hard disk drive不使用CHS但LBA,因此块地址不会立即与其物理位置相关(disk controller本身会处理映射)
在某些情况下,内核磁盘driver和file system会重新组织待处理的磁盘请求。
但是,您最好在足够大的缓冲区上执行磁盘IO (通常,至少每个read(2)或write(2)都会有几页4K字节。< / p>
在Linux上,另请参阅sync(2),fsync(2),posix_fadvise(2),readahead(2),mmap(2),madvise(2)系统调用
鉴于一堆偏移量,您将如何有效地读取逻辑记录?
你可能会订购这些补偿,但这实际上不会发生很大变化,也可能根本不会变化。一定要做基准测试。
在实践中,请使用某些库,例如leveldb或gdbm(索引文件)或sqlite。您可以调整一些参数(缓冲区大小),但您应该信任该库的其余部分。