【问题标题】:Seek time vs Sequential read寻道时间与顺序读取
【发布时间】:2012-06-14 12:53:16
【问题描述】:

假设在硬盘上我有一些非常大的字符序列数据文件:

ABRDZ....

我的问题如下,如果头部位于文件的开头,并且我需要每 1000 个位置间隔 5 个字符,最好是做一个 Seek(因为我知道在哪里看)或者干脆有一个大缓冲区,只按顺序读取,然后在内存中执行工作。

我天真地回答说,读取“A”然后寻求读取“V”比 >> 读取所有文件直到位置 200(“V”的位置)要快。好的,这只是一个例子,因为最小的 I/O 是 512 字节。

编辑:我之前的自我天真回答在以下情况下得到了部分证明:给定一个 100Gb 的文件,我需要第一个和最后一个字符;在这里,我显然会寻求....对吗?

也许在搜索“多长时间”与要检索多少数据之间进行权衡?

有人可以向我解释一下吗?

【问题讨论】:

  • 巨大的假设是文件是并且将保持连续!
  • 没错,但应该有办法确保这一点,不是吗?更重要的是,碎片整理会对顺序读取造成比查找更大的损害。
  • 确保连续性不是免费的。对框架文件进行建模并不那么简单。我原以为它对串行读取和查找的影响几乎相同。可怕的是,间隔是一个块或更大。
  • 我也有同样的问题。我需要将经常访问的数据存储在一个非常大的文件中。把它放在文件末尾对我来说更方便。我想考虑对性能的影响:寻求接近文件末尾会影响性能吗?鉴于在 4K 块碎片文件上,文件系统需要以某种方式读取和导航块的链接列表以到达寻找的位置!寻道时间是否等同于读取时间?分配的块列表是否存储在连续部分的其他位置,这会缩短种子时间?
  • @PhilibertPerusse 我会说:将您经常访问的数据放在文件的开头,将其加载到内存中,并保留在那里。

标签: arrays hard-drive seek sequential


【解决方案1】:

[更新] 通常,从您的原始数字中,每 1000 个中有 5 个(假设 5 个字节是 1000 的一部分,因此使您的步数为 1000),如果您的步数小于块大小的 2 倍,那么我的原始答案是很好的解释。一旦超过 HD 块大小的 2 倍,它确实会变得更加棘手,因为那时,您很容易浪费读取时间,而您可以通过寻找过去未使用的(或就此而言不必要的)来加速) 高清块。

[原创] 嗯,这是一个非常有趣的问题,我相信这是一个同样有趣的答案(也有些复杂)。我认为这实际上归结为其他几个问题,例如您在驱动器(或您的软件将在其上运行的驱动器)上实现的块大小有多大。如果您的块大小为 4KB,那么您的硬盘驱动器一次将为您获得的(真实)最小值是 4096 字节。在您的情况下,如果您确实每 1000 个字符需要 5 个字符,那么如果您使用所有磁盘 IO 执行此操作,那么您实际上将重新读取相同的块 4 次,并在其间进行 3 次查找(真的没有效率)。

我个人认为,您可以(如果您想提高驱动效率)在您的代码中,尝试了解您正在使用的驱动器的块大小是多少,然后使用该大小数字来了解多少字节您应该将其带入 RAM 的时间。这样一来,您就不必拥有巨大的 RAM 缓冲区,但同时也不必真正进行 SEEK,也不会浪费(或执行)任何额外的读取。

这是最有效的吗? 我不认为它是最有效的,但它可能足以满足您需要的性能,谁知道呢。我确实认为,即使读取头在您想要的位置,如果您在每个块读取的中间执行算法工作,而不是一次读取整个文件,您将浪费时间等待驱动盘片的下一次旋转。然而,如果您要一次读取所有文件,则驱动器应该能够一次对文件的所有部分执行顺序读取。再次不是那么简单,就像您的文件确实超过 1 个块一样,在旋转驱动器上,如果您的驱动器没有进行碎片整理,您可能会受到影响,因为它可能必须执行随机搜索才能到达下一个块。

对不起,对于冗长的答案,但通常情况下,您的情况没有简单的答案。

我确实认为,如果您一次读取整个文件,整体性能可能会更好。无法确保这一点,因为每个系统的驱动器设置等参数都不同...

【讨论】:

  • 啊哈!谢谢,您对我的问题“如果您的步数少于您的块大小的 2 倍”这个问题说得对,这看起来像是寻找更好的标准。你有这方面的参考吗?
  • 很遗憾,我没有这方面的参考资料,这是我自己的经验 :-) 抱歉....
猜你喜欢
  • 2013-10-13
  • 2017-01-03
  • 1970-01-01
  • 2013-05-23
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多