【发布时间】: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