让我们假设在硬盘驱动器上我有一些字符序列非常大的数据文件:
... ABRDZ
我的问题如下,如果头部位于文件的开头,并且我每1000个位置间隔需要5个字符,那么最好是做一个Seek(因为我知道在哪里看)或者只是一个只按顺序读取然后在内存中完成工作的大缓冲区。
天真的我已经回答说读'A'然后寻求读'V'比>>更快读取所有文件,直到位置200('V'的位置)。好的,这只是一个例子,因为最小的I / O是512字节。
编辑:我以前的自我回答是部分证明以下情况:给定100Gb文件我需要第一个和最后一个字符;在这里,我显然会寻求......对吧?
也许在搜索的“长”与要检索的数据量之间存在折衷?
有人可以向我澄清这个吗?
答案 0 :(得分:0)
<强> [UPDATE] 强> 通常,从原始数字中每1000个中有5个,(我假设5个字节是1000的一部分,从而使步数为1000),如果您的步数小于块大小的2倍,那么我的原始答案是很好的解释。一旦你的HD块大小超过2倍,它确实会变得有点棘手,因为在那一点上,你很容易浪费阅读时间,当你可以通过寻找过去的未使用时加速(或者不必要的话) )HD块。
<强> [原稿] 强> 嗯,这是一个非常有趣的问题,我认为这是一个同样有趣的答案(也有些复杂)。我认为实际上这可归结为其他几个问题,比如你在驱动器上实现的块大小(或者你的软件将要运行的驱动器)。如果你的块大小是4KB,那么你的硬盘驱动器一次最小的(真)最小值是4096字节。在你的情况下,如果你真的需要每1000个5个字符,那么如果你使用所有磁盘IO进行此操作,那么你基本上将重新读取相同的块4次,并且在3之间进行寻找(真的不高效)。
我个人认为你可以(如果你想提高驱动效率)在你的代码中,尝试了解你正在使用的驱动器的块大小,然后使用该大小数来知道在多少字节你应该带入RAM的时间。这样你就不必拥有一个巨大的RAM缓冲区,但同时不需要SEEK,不会浪费(或执行)任何额外的读取。
这是最有效的吗? 我不认为它是最有效的,但它可能足以满足您所需的性能,谁知道。我确实认为,即使读头是您想要的位置,如果您在每个块读取的中间执行算法工作,而不是一次读取整个文件,那么您将浪费时间等待下一轮驱动盘片。如果您要一次性读取所有内容,驱动器应该能够立即执行文件的所有部分的顺序读取。同样不是那么简单,就好像你的文件真的超过1个块,在旋转驱动器上,如果你的驱动器没有进行碎片整理,你可能会受到影响,因为它可能必须执行随机搜索才能到达下一个块。
对不起,对于冗长的回答,但通常情况下,你的案子没有简单的答案。
我认为如果你只是一次阅读整个文件,整体性能可能会更好。没有办法确保这一点,因为每个系统都会有其固有的驱动设置参数等等......