1ノードあたり64k pointsとして、全世界で多分13か14 depthぐらいなので、びっくりするぐらい速そう。
かつて派遣でSQL Serverの(普通の)インデックスで必死こいて座標点絞り込みやってたのが馬鹿らしくなるかもしれない
オンメモリ辞書よりは遅いだろうけど、sqliteだから全世界のnodeを格納できる
node,way,relationsのストアで350GBぐらいになったので、quadtreeのインデックス格納すると500GBは超えてしまいそうなのが問題か
NVMe SSDじゃないとストアが話にならんほど遅いので、あんまりでかくなると扱いにくい(一度作ってしまえば非常に楽だけど
quadtreeのインデックスは別に生成するように作ってるけどインターフェイスでプロバイダを分離しているので、どんなデータベースとも接続できる。
なので、osmのnodeテーブルに直接カラム生やしたほうがサイズを削減できて良いかも知れない
osm pbfの日本リージョンを挿入してみている(まだ終わってない)。境界値バグがあったので修正して、途中でトランザクションを無理やりコミットできるようにFlushAsync()みたいなメソッドを生やした。
座標点が莫大なので、途中でもコミットしておかないとログが大きくなりすぎる。
幸い、DbCommandのキャッシュ制御を内部でやっていて、一括でコミットと破棄、初期化が出来ていたので、FlushAsync()時にそうすることで簡単に対応できた。
n次元対応で結構オーバーヘッド大きくなったはずだけど、バックエンドがADO.NETだと計算コストなんて微々たるもののようで(まあそれはそう)、かなり高速にbulk insert出来てる。目測で秒間20万点ほど。明日全世界で試してみよう
忘れないようにメモ:
* node depthが深くなりすぎた場合にdistributionを諦めるチェック
* dimension countが一致することのチェックを入口付近で行う
終わった。
Finished: Count=261461290, Elapsed=00:20:42.7300249
いいね。終盤でも殆ど挿入速度に変化なかったので、全世界にも期待できそう
1日と3時間ぐらいで挿入できたんだけど、その直後に境界バグ踏んでるのを見つけたので、再度実行を仕掛けた orz
浮動小数点めんどくさい。haskellみたいに数値演算を抽象化する何かがあれば、任意の型を座標点に使う型に出来て柔軟性が増すんだけどな(座標点を64bit整数でやりたい