もう1つのオプションは、少なくとも自分で実装する場合は、ページテーブルです。これは、仮想メモリシステムで仮想アドレスを物理アドレスにマップするために一般的に使用され、アドレススペースがまばらに配置され、使用されるアドレスがクラスター化されている場合に最適に機能します。使用するアドレスがランダムに分散している場合、これは効果が低くなります。
ページテーブルの基本的なアプローチは、 Trieと同じです-再帰的なサブディビジョン。ページテーブルには固定数のレベルがあり、各ノードは固定サイズの配列です。特定のサブノードのエントリがnullの場合、そのノードでカバーされるすべてのリーフはnullです。ページテーブルの主な利点は、ルックアップが高速で、わずかなビットシフトと逆参照のみが必要なことです。
2レベルのページテーブルの簡単なPython実装を見てみましょう。
class Pagetable(object):
def __init__(self, num_bits=8):
"""Creates a new Pagetable with num_bits bits per level.
Args:
num_bits: The number of bits per pagetable level.
A 2 level pagetable will be able to store indexes between 0 and 2^(num_bits*2).
"""
self.num_bits = num_bits
self.mask = (1 << num_bits) - 1
self.root = [None] * (2 ** num_bits)
def __getitem__(self, idx):
page = self.root[idx >> self.num_bits]
return page and page[idx & self.mask]
def __setitem__(self, idx, val):
page = self.root[idx >> self.num_bits]
if not page:
page = self.root[idx >> self.num_bits] = [None] * (2 ** self.num_bits)
page[idx & self.mask] = val