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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Takatomo Torigoe
November 27, 2020
Programming
0
1.1k
DynamicでScalableな空間分割データ構造Bkd-Tree
社内勉強会資料です。
Takatomo Torigoe
November 27, 2020
Tweet
Share
More Decks by Takatomo Torigoe
See All by Takatomo Torigoe
型付きアクターモデルがもたらす分散シミュレーションの未来
piyo7
0
1.1k
AI動画生成ガチャ紹介
piyo7
1
370
AIイラスト生成・編集テクニック紹介
piyo7
2
470
PandasAIにおけるLLMを用いた自然言語クエリの仕組み
piyo7
0
540
HdrHistogram紹介:ストリーミングで統計値を算出するための 高速・省メモリなライブラリ
piyo7
0
450
AI画像生成の紹介スライドをAI画像とAIチャットで作ってみた
piyo7
0
360
将棋AI「dlshogi」紹介
piyo7
1
1k
軌跡検索エンジンT-Torch論文紹介
piyo7
0
280
アドテクと機械学習
piyo7
0
380
Other Decks in Programming
See All in Programming
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
180
AI時代の認知負荷との向き合い方
optfit
0
110
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
140
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
390
CSC307 Lecture 06
javiergs
PRO
0
680
Vibe codingでおすすめの言語と開発手法
uyuki234
0
210
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
130
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
430
OCaml 5でモダンな並列プログラミングを Enjoyしよう!
haochenx
0
100
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
500
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
1.9k
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
2.6k
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
400
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
130
Code Reviewing Like a Champion
maltzj
527
40k
Are puppies a ranking factor?
jonoalderson
1
2.7k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1.1k
Exploring anti-patterns in Rails
aemeredith
2
230
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
110
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
100
Agile that works and the tools we love
rasmusluckow
331
21k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
110
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
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桁安い。 ◦ 木のマージ自体はコスト高いが、その間もクエリは投げられる。