为什么在磁盘上存储时尝试比哈希表慢?

时间:2013-12-20 17:16:12

标签: performance data-structures hash hashtable trie

我听说当数据限制存储在磁盘而不是主存储器上时,尝试的效率低于执行查找的哈希表。为什么会这样呢?

1 个答案:

答案 0 :(得分:3)

在磁盘上,随机访问很慢,因为为了在特定位置读取字节,硬盘驱动器必须物理旋转以将这些字节放在读头下。在磁盘上进行随机访问的成本比可比较的RAM访问速度快数百万倍。

除此之外,无论何时从磁盘读取数据,都会从磁盘读取称为页面的内存块,而不仅仅是您要求的字节。这意味着如果从磁盘读取一些数据,访问该字节附近的字节可能会非常快,因为该数据将从同一页面读取并加载到RAM中。这意味着磁盘上的数组中的顺序访问将很快,因为在第一次(慢)读取以获取第一个数组元素的字节读取之后,下一个数组元素的字节可能已经被加载并且可用。 / p>

考虑这对尝试与线性探测哈希表的意义。 trie是一种树结构,其中查找需要跟随许多指向节点中没有特定顺序排列的节点的指针。这意味着trie查找的成本可能是每个字符串读取一个磁盘,这非常低效。另一方面,如果你有一个使用线性探测的哈希表,查找的成本(大致)将是一个磁盘读取的成本,因为在找到表中的初始点之后,值应该是数组读取不需要将来的磁盘读取。

请注意,并非所有尝试和所有哈希表都具有此属性。缓存不经意尝试是专门构建的尝试,以最小化磁盘读取,并且可以非常快速地在外部存储器中。许多哈希表(如链式哈希表或双哈希表)具有更多分散的查找模式,因此会产生更多的磁盘读取。

希望这有帮助!