【问题标题】:Efficient way to do random file access?进行随机文件访问的有效方法?
【发布时间】:2013-02-06 08:49:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为,在内部,分页算法至少会交换一页(可能是 4K)供您的程序读取。但这对您的代码是透明的,不是吗? 进行随机文件访问的有效方法?内存映射文件呢
  • 是的,它是透明的。但是如果最后一个陈述是真的,那么我很可能需要自己进行某种对齐以防止访问时出现错位?
  • 您刚刚提出的每个问题都是依赖于操作系统和/或运行时的实现。它们将是决定答案的最终决定因素。

标签: c++ c filesystems


【解决方案1】:

我没有时间详细回答,所以我会简短:

  1. 现代磁盘上的磁盘扇区大小比应用程序可见的级别低;大多数时候,甚至操作系统都无法信任磁盘报告的数字。它在很大程度上也与性能无关。

  2. 假设一个传统的文件系统,键对齐在磁盘块大小和缓冲区缓存之间。这发生在操作系统/文件系统中,对您的关键约束是所有应用程序级别的 IO-ops 都是整数个块。请理解,虽然这会持续到磁盘上,但扩展区和升降机可能会导致操作延迟、拆分或重新排序。

  3. 所有现代磁盘都有磁盘缓存,尽管出于性能/可靠性原因可能会禁用更高级的磁盘。同样,从块映射到等效扇区以及磁盘升降机可能会导致延迟、拆分、合并和重新排序;但是,大多数情况下您无需担心这一点。只要确保磁盘不会谎报当前的写入状态即可。

  4. 在大多数文件系统中,文件与块对齐。鉴于 1-block 是最小读取,扇区对齐不是您关心的问题,无论如何您也无能为力。信任文件系统/io 子系统来适当地执行此操作

  5. 如果块是连续的,那么您最终阅读两次的可能性很小。您将读取两个块,但考虑到轨道间寻道时间较短,以及如今普通磁盘的顺序读取速度,预读可能已为您的单个块请求读取了六个块,因此第二个块是空闲的。注意:这仅适用于块是连续的。如果出现碎片,您将获得一个短或长的搜索,如果您执行太多次,这会影响您的性能。

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

【讨论】:

    【解决方案2】:

    Just Do It 最简单的方法。比这更复杂的事情让你付出高昂的代价(在编程、调试和维护时间方面),除非测量表明这是你系统中的瓶颈,否则它只是浪费精力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2013-10-15
      相关资源
      最近更新 更多