osmのデータをsqliteにぶっこんで、ポータブルな座標抽出が出来るやつを作っている
sqliteは久しぶりに触っているけど、こんなに速かったっけというぐらい速い
rtreeちゃんと実装するのは骨が折れそうなので、quadtreeの変形で試してる

1ノードあたり64k pointsとして、全世界で多分13か14 depthぐらいなので、びっくりするぐらい速そう。

かつて派遣でSQL Serverの(普通の)インデックスで必死こいて座標点絞り込みやってたのが馬鹿らしくなるかもしれない

オンメモリ辞書よりは遅いだろうけど、sqliteだから全世界のnodeを格納できる

node,way,relationsのストアで350GBぐらいになったので、quadtreeのインデックス格納すると500GBは超えてしまいそうなのが問題か

NVMe SSDじゃないとストアが話にならんほど遅いので、あんまりでかくなると扱いにくい(一度作ってしまえば非常に楽だけど

quadtreeのインデックスは別に生成するように作ってるけどインターフェイスでプロバイダを分離しているので、どんなデータベースとも接続できる。

なので、osmのnodeテーブルに直接カラム生やしたほうがサイズを削減できて良いかも知れない

lookupも機能するようになった
removeを実装した。rebalanceしてないけど、まあ当初目的は達成したからこれでリリースするか

osm pbfの日本リージョンを挿入してみている(まだ終わってない)。境界値バグがあったので修正して、途中でトランザクションを無理やりコミットできるようにFlushAsync()みたいなメソッドを生やした。

座標点が莫大なので、途中でもコミットしておかないとログが大きくなりすぎる。

幸い、DbCommandのキャッシュ制御を内部でやっていて、一括でコミットと破棄、初期化が出来ていたので、FlushAsync()時にそうすることで簡単に対応できた。

n次元対応で結構オーバーヘッド大きくなったはずだけど、バックエンドがADO.NETだと計算コストなんて微々たるもののようで(まあそれはそう)、かなり高速にbulk insert出来てる。目測で秒間20万点ほど。明日全世界で試してみよう

QuadTreeの実装はなにかを参考にしたわけではなく、概念の説明から自力で起こしたんだけど、最終的にDBをストレージとして使用する前提での内部構造が、はじめから頭の中にあったわけではなく、操作メソッドを実装しつつリファクタリングで調整していったんだけど、今の実装はそこそこの効率と見通しの良さを達成してて、まあうまく着地できて良かったなぁと思ってる。

忘れないようにメモ:

* node depthが深くなりすぎた場合にdistributionを諦めるチェック
* dimension countが一致することのチェックを入口付近で行う

最大のnode depthは全世界でいうとどのぐらいなのかな。20超えるぐらいでdoubleの精度の限界に来そうな気がする
updateはconcurrencyさぽーとしないと決めたので、ログをメモリに配置できてる。これもしかして、対HDDでもそこそこ使い物になるのかも知れない...

終わった。

Finished: Count=261461290, Elapsed=00:20:42.7300249

いいね。終盤でも殆ど挿入速度に変化なかったので、全世界にも期待できそう

最終的なファイルサイズは約13GBだった
0.11.0をデプロイしたので、もう一度japan-latestで試してる。変に解放されれない要素とかなさそうで安定して推移してる。
OsmSharpのストリーミングデシリアライザをそのまま突っ込めるようにするという当初目算も達成
全世界始めた。24Hで終わるかな
あ、いや、日本で20分だからもっと早いか。全ノード数メモっておけばよかった

1日と3時間ぐらいで挿入できたんだけど、その直後に境界バグ踏んでるのを見つけたので、再度実行を仕掛けた orz

浮動小数点めんどくさい。haskellみたいに数値演算を抽象化する何かがあれば、任意の型を座標点に使う型に出来て柔軟性が増すんだけどな(座標点を64bit整数でやりたい

まあ今度はjapan-region全部の点が一致することを確認したので、問題ないと思う(まる一日ぐらいかかった
MassivePointsにpolylineのサポートを加えるかどうかで悩ましい。ぐぐる地球的なものを作ろうとすると必須なので、多分入れることになるとは思うけど、バックエンドがDBだと効率よくノード分割する方法が思いつかないんだよな...
lookupは現状の検索と遜色ない速さが出せそうなんだけど、insertとremoveがめっちゃ遅くなりそう