Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DynamicでScalableな空間分割データ構造Bkd-Tree
Search
Takatomo Torigoe
November 27, 2020
Programming
0
730
DynamicでScalableな空間分割データ構造Bkd-Tree
社内勉強会資料です。
Takatomo Torigoe
November 27, 2020
Tweet
Share
More Decks by Takatomo Torigoe
See All by Takatomo Torigoe
AIイラスト生成・編集テクニック紹介
piyo7
2
250
PandasAIにおけるLLMを用いた自然言語クエリの仕組み
piyo7
0
350
HdrHistogram紹介:ストリーミングで統計値を算出するための 高速・省メモリなライブラリ
piyo7
0
250
AI画像生成の紹介スライドをAI画像とAIチャットで作ってみた
piyo7
0
300
将棋AI「dlshogi」紹介
piyo7
1
550
軌跡検索エンジンT-Torch論文紹介
piyo7
0
170
アドテクと機械学習
piyo7
0
300
Let's Simulate a Quantum Computer with Pretty Scala
piyo7
0
30
量子コンピュータでニューラルネットワークな論文紹介
piyo7
0
35
Other Decks in Programming
See All in Programming
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
230
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
480
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
Contemporary Test Cases
maaretp
0
140
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
190
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
920
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
Remix on Hono on Cloudflare Workers
yusukebe
1
290
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
.NET のための通信フレームワーク MagicOnion 入門 / Introduction to MagicOnion
mayuki
1
1.6k
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
The Cult of Friendly URLs
andyhume
78
6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Done Done
chrislema
181
16k
Rails Girls Zürich Keynote
gr2m
94
13k
Visualization
eitanlees
145
15k
Side Projects
sachag
452
42k
Embracing the Ebb and Flow
colly
84
4.5k
GraphQLとの向き合い方2022年版
quramy
43
13k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Transcript
Dynamic で Scalable な 空間分割データ構造 Bkd-Tree 鳥越貴智 2020/11/27 データサイエンス共有会 #meetup_ds
Bkd-Tree? 全文検索エンジンElasticsearchで、地理インデックスとして使われている。 BKD-backed geo_shapes in Elasticsearch: precision + efficiency +
speed Geospatial Advancements in Elasticsearch Elasticsearchのコアである Apache Luceneで実装されている。 org.apache.lucene.util.bkd
Bkd-Tree? kd-Treeの亜種。ざっくり言うとforest of balanced binary kd-trees。 kd-Treeについては「k-d treeによる最近傍探索」が分かりやすい。 K-D-B-Treeよりもディスク使用率が高く追加コストを安くした、という触れ込み のためK-D-B-Treeから紹介します。
ちなみにK-D-B-TreeはWikipediaに英文記事があるものの、Bkd-Treeの解説記事 はほぼ無く「The Bkd Tree: A Dynamic Disk Optimized BSP Tree」くらい。
K-D-B-Tree The K-D-B-Tree : a search structure for large multidimensional
dynamic indexes (1981)
range query を想定 [K-D-B-Tree] Data Structure Region Pages Point Pages
平衡多分木 1 Nodeを 1 Pageに メモリ配置
[K-D-B-Tree] Insertions 1. 木を辿って、Pointの位置を含むPoint Pageを探し、Pointを追加する。 2. Pointが増えてPoint Pageが溢れたら、Regionを分割する。 3. Regionが増えてRegion
Pageが溢れたら、さらに親のRegionを分割する。 親Regionの分割は、 子Regionの分割を引き起こすため、 コストが高い。
[K-D-B-Tree] Splitting Patterns ] Pointの分布特性を知っているならば、 Cyclic以外の分割パターンの方がいい場合もある。
[K-D-B-Tree] Deletions and Reorganization 1. Pointが属するPoint Pageから、Pointを削除する。 2. ストレージ使用率が減ってきたらリバランス。 (リバランス例)
Region Page A, B, Cの使用率が半分を切ったため、 どれか二つを合体させたいが、 長方形にするためには三つ合体させないといけない。 しかし三つ合体すると溢れるため、 二つの長方形に再分割を行う必要がある。
[K-D-B-Tree] Utilization 空のK-D-B Treeに 一様乱数で発生させた100,000Points をCyclicに分割してInsertした実験
Bkd-Tree Bkd-Tree: A Dynamic Scalable kd-Tree (2003)
[Bkd-Tree] Main Idea • K-D-B-Treeは追加削除時にリバランスすることでクエリ性能を保つ代わり、 ストレージ使用率が低下する。(その後に提案されたhB-Treeも同じ) • Bkd-Treeはリバランスせず、後述の「Bulk Load」「Logarithmic Method」
という手法によって、ストレージをほぼ100%で使いきる。 // Bkd-Treeの論文はPageではなくBlockで使用率を考えている。K-D-B-Treeも 1 Node 1 Pageに拘らなければ、キャッシュヒット落とさず使用率上げる 実装はできる気がするものの、これは現代の感覚か(?) // 使用率は置いておいても、枝の数がまちまちだとクエリ性能落ちるので、 できるだけ木をコンパクトにするのは重要なはず。
[Bkd-Tree] Bulk Load • Bkd-Treeは2分木 ◦ 葉は一定数のPointを保持する。 ◦ 葉のインデックスのシフト演算で、子 ノードのポインタを置き換えられる。
• 空の木に1点ずつ追加するのではなく、ま とめて木を構築する。 (not Dynamic) • 1階層ごとにソートして分割位置を決める のではなく、グリッド行列で一気に掘る。
[Bkd-Tree] Logarithmic Method • サイズが指数的に膨らんでいく木の列をなす。ただし列は欠けてもよい。 • クエリは並列的に投げる。 • Point追加は、メモリ上のバッファ木 に対して行う。 ◦
これはリバランスせず、Leafを大きくしたり深くしたりするはず。 • バッファ木が溢れたら、ストレージ上の木とBulk Loadによってマージ。 ◦ 下図の場合 をマージして、 size 4Mの を作り出し、 を空にする。
[Bkd-Tree] Insertion Performance • Bkd-Treeは、追加コストがK-B-D-Treeより2桁安い。 ◦ 木のマージ自体はコスト高いが、その間もクエリは投げられる。