<< Mac OS X(Leopard 10.5.3)でPython環境 | top | VBユーザーのためのGDAL/OGR >>

SQLiteってば速い(with トランザクション)

MapScriptやGDAL/OGRをデスクトップのアプリケーション開発に使いだすと、一時的に検索した地物などを書き出したくなる。

PostgeSQL+PostGISを使っていれば、select文の結果をテーブルにinsertすればよいのだけれども、デスクトップのアプリケーションは、ネットワークに接続できない事態も想定して、サーバーへの問い合わせをしなくもいいようにしたい。

MapScriptを使うのであれば、mapObj.saveQuerymapObj.loadQueryを使うと、複数の検索結果を保存したり読み込んだりできるようになって便利である。ただ、検索結果が数十万件もあるとちょっと使うが不便である。

VB(.NET)からSQLiteをODBCやADO.NET経由でアクセスするところを調べていた(1,2)のは、この一時置き場としてSQLiteが使えないかと思ったからである。

ローカルで使える SQLiteは、トランザクションの開始、コミットを使うと爆速である。
Googleで、『SQLite トランザクション』で検索すると、いろいろな人がその速さの比較記事を書いている通りで、80万件の書き込みで、1分足らずで終了する。Group By によるグループ化を実行して、30万点に圧縮するのに、3分かかる。

空間データ基盤25000には、道路ネットワークのリンクとノードの情報があるが、同じ位置に複数のノードがあったりして、ネットワークのデータベースを作る上でちょっと困るところがある。ノードとリンクがつながらなくなるからだ。

そこで、リンクだけを使って、MapScriptで、始点・終点の座標値X,Yを取得する。2本のリンクが端点で接してる場合、当然同じ点を登録(重複)することになるが、とりあえず、X、Yを取得したら、SQLiteでテーブルに書き込んでしまう。

この、
・MapInfoテーブル内のすべてのポリラインの始終点の取得
・SQLiteでテーブルに、Insert
・上記で作成されたテーブルのX、Yの値を使った文字列でGropu Byでグループ化
という処理が、MapScriptとSQLiteプロバイダーの組み合わせにも関わらず、びっくりするほど速くて、とても嬉しい裏切りをしてくれました。

1件あたり、40万のリンクに対して、重複した点がある場合の始終点のレコード数は約80万件はちょうど60秒。そこから重複点の除去のための、select * from ○○ group by X_Y みたいな処理で、ノードの数を圧縮するまでに、3分かかる。

処理したデータを永続化するのに、バイナリーファイルに書き込んだりしていたけれども、SQLで検索できてこのスピードがあるならば、いままでのノウハウはもういらん。
SQLiteを本格的に空間処理に応用しようかと思った次第だ。

当然、Python でも SQLite は使える。スクリプト言語であるけれども、どのくらいの速度が出るのか楽しみだ。
bugna | SQLite | 23:50 | comments(0) | trackbacks(0) | - | - |
Comment









Trackback
URL:

07
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--