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
770
DynamicでScalableな空間分割データ構造Bkd-Tree
社内勉強会資料です。
Takatomo Torigoe
November 27, 2020
Tweet
Share
More Decks by Takatomo Torigoe
See All by Takatomo Torigoe
AIイラスト生成・編集テクニック紹介
piyo7
2
290
PandasAIにおけるLLMを用いた自然言語クエリの仕組み
piyo7
0
390
HdrHistogram紹介:ストリーミングで統計値を算出するための 高速・省メモリなライブラリ
piyo7
0
280
AI画像生成の紹介スライドをAI画像とAIチャットで作ってみた
piyo7
0
310
将棋AI「dlshogi」紹介
piyo7
1
610
軌跡検索エンジンT-Torch論文紹介
piyo7
0
200
アドテクと機械学習
piyo7
0
310
Let's Simulate a Quantum Computer with Pretty Scala
piyo7
0
32
量子コンピュータでニューラルネットワークな論文紹介
piyo7
0
41
Other Decks in Programming
See All in Programming
PHPカンファレンス 2024|共創を加速するための若手の技術挑戦
weddingpark
0
130
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
240
functionalなアプローチで動的要素を排除する
ryopeko
1
190
AppRouterを用いた大規模サービス開発におけるディレクトリ構成の変遷と問題点
eiganken
1
440
ドメインイベント増えすぎ問題
h0r15h0
2
560
Findy Team+ Awardを受賞したかった!ベストプラクティス応募内容をふりかえり、開発生産性向上もふりかえる / Findy Team Plus Award BestPractice and DPE Retrospective 2024
honyanya
0
140
Оптимизируем производительность блока Казначейство
lamodatech
0
940
快速入門可觀測性
blueswen
0
500
非ブラウザランタイムとWeb標準 / Non-Browser Runtimes and Web Standards
petamoriken
0
430
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
10
5k
Flatt Security XSS Challenge 解答・解説
flatt_security
0
710
Fixstars高速化コンテスト2024準優勝解法
eijirou
0
190
Featured
See All Featured
KATA
mclloyd
29
14k
Optimizing for Happiness
mojombo
376
70k
Designing for Performance
lara
604
68k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Designing for humans not robots
tammielis
250
25k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Facilitating Awesome Meetings
lara
51
6.2k
GitHub's CSS Performance
jonrohan
1030
460k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
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桁安い。 ◦ 木のマージ自体はコスト高いが、その間もクエリは投げられる。