有效的方式来进行随机文件访问?

时间:2013-02-21 05:37:26

标签: c++ c filesystems

实际上这里有几个关于传统硬盘的问题。

磁盘上的每个读/写是否与系统缓存/扇区大小对齐?

在磁盘上创建的每个文件是否与扇区对齐?我的意思是,如果我创建一个文件,文件的起点将与扇区的起点相同?

如果我的扇区大小为4096并且我想使用fseek ( pFile , 10 , SEEK_SET );从位置10读取4096个字节,那么我最终会阅读两次?

2 个答案:

答案 0 :(得分:2)

我没有时间进行广泛的回答,所以我会简短的说明:

  1. 现代磁盘上的磁盘扇区大小低于应用程序可见的磁盘扇区大小;大多数情况下,即使操作系统也不能信任磁盘报告的数字。它在很大程度上与表现无关。

  2. 假设有一个传统的文件系统,密钥对齐是在磁盘块大小和buffercache之间进行的。这发生在OS /文件系统中,对您的关键约束是所有应用程序级IO-op都是块的整数。了解虽然这会持续存在于磁盘上,但扩展区和电梯会导致操作被延迟,拆分或重新排序。

  3. 所有现代磁盘都有磁盘缓存,但出于性能/可靠性原因,可能会禁用更高级的磁盘缓存。同样,从块到扇区等价物和盘上电梯的映射可能导致延迟,拆分,合并和重新排序;但是,大多数时候你不需要担心这一点。只需确保磁盘不会出现写入的当前状态。

  4. 在大多数文件系统中,文件与块对齐。鉴于1块是最小读数,扇区对齐不是您的关注,无论如何您无法做任何事情。信任文件系统/ io-subsystem以适当地执行此操作

  5. 如果块是连续的,则极不可能最终读取两次。您将读取两个块,但由于这些天的轨道间寻道时间较短,平均磁盘的顺序读取速度,预读可能会为您的单个块请求读取六个块,因此第二个块是空闲的。注意:这仅适用于块是连续的。如果存在碎片,你会得到一个短期或长期的寻求,如果这样做太多次,那将会扼杀你的表现。

  6. 如果这对您很重要,您需要花时间了解您可用的文件系统;他们的调整参数;并相应地规划您的数据结构。您可能还应该参数化您的结构,以便您可以使用稍微不同的应用程序级块/读取缓冲区/写入缓冲区大小。

答案 1 :(得分:0)

Just Do It 最简单的工作方式。进一步复杂的事情使你付出沉重的代价(在编程,调试和维护时间),除非测量表明这是你系统的瓶颈,它只是浪费精力。