gpt4 book ai didi

c++ - 进行随机文件访问的有效方法?

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:17 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

我没有时间做详尽的回答,所以我会简短一点:

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

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

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

  4. 在大多数文件系统中,文件与 block 对齐。鉴于 1 block 是最小读取,扇区对齐不是你关心的,而且你也无能为力。相信文件系统/io 子系统会适本地执行此操作

  5. 如果 block 是连续的,您不太可能最终阅读两次。您将读取两个 block ,但考虑到低磁道间寻道时间和这些天平均磁盘的顺序读取速度,预读可能已经为您的单个 block 请求读取了六个 block ,因此第二个 block 是空闲的。注意:这仅适用于 block 是连续的。如果存在碎片,您将进行短寻道或长寻道,如果寻道次数过多,将会降低性能。

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

关于c++ - 进行随机文件访问的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com