|
|
HashソースはGitHubに移行しました。
並行処理の観点からハッシュテーブルのアルゴリズムについて調べてみた。
分類ハッシュテーブルを分類する観点として、以下の3つを考える。 データ格納法Chain (Open Hash)型教科書に最初に出てくるハッシュ法。同じハッシュ値を持つ要素はリストに連結される。
現時点で実装したのは以下: Open Address (Closed Hash)型配列ベースのハッシュ法。要素は必ず配列に保存される。同じハッシュ値を持つ要素があると、どちらかを別の場所に移動する。
現時点で実装したのは以下: テーブルの再構築(resize)
要素数に応じてテーブルを拡大(再構築:resize)するか否か。 resizeなし
予め十分なテーブルサイズをとる。Chain(Open Hash)型ならば追加できる要素数に制限がないが、Open Address(Closed Hash)型の場合は事前に用意した要素数しか保存できない。
ロック粒度Lockベース
粗粒度から細粒度までバリエーションあり。 Lock-Freeresize(再構築)を考えなければ比較的簡単に実装できる。 たとえば "High Performance Dynamic Lock-Free Hash Tables and List-Based Sets"。 これはハッシュテーブルに付随するリストをLockFreeにするというほぼ自明な実装。 resize処理をLock-Freeで行うアルゴリズムも提案されているが、実用的ではないと思われる。参考文献を参照のこと。 resize(再構築)している間、すべての処理が止まるのは悔しいが、 ふと学生時代に使ったアルゴリズムの教科書をみたら 「新しいテーブルに全部の要素を移してから挿入するほうが平均時間が短いし、あとの操作のことを考えると、 テーブルを作りなおす時間のもとは十分にとれる」という記述をみつけ、含蓄のある言葉だなと感心した次第。 resizeあり
要素数が一定以上増加すると、テーブルサイズを大きくして衝突確率を下げる。resize(再構築)時には全ての処理が止まる。
参考文献Lock-Free/Wait-freeでめぼしいものをピックアップ:
Chain (Open Hash)型"High Performance Dynamic Lock-Free Hash Tables and List-Based Sets"リスト部分をLock-Freeリストにしたもの。resize(再構築)に関する記述ないが、Lock-freeでresizeはできないはず。"Split-Ordered Lists: Lock-Free Extensible Hash Tables"resize(再構築)はOSのメモリアクセスと同じような"多段階アクセス"を使って*避けて*いる。基本的なアルゴリズム: これに対してresizeを避ける方法: Open Address (Close Hash)型Almost Wait-free Resizable Hashtables
同一著者による3本。短縮版1本と詳細版2本。アルゴリズムの正当性確認にPVSを使っている。 "Non-blocking hashtables with open addressing"resizeはLock-freeでない。
Last-modified: 2014-7-6
|