← ブログ一覧へ

隣地抽出と点数補正が速くなりました

隣地抽出を約 13 倍、一括点数補正を約 3 倍速くしました。半径を指定した抽出と、筆界未定の表示も待たされなくなっています。実測した数字を載せています。

実測した数字

よく使われる操作の速度をまとめて見直しました。本番環境で測った数字です。

操作 これまで いま
隣地抽出(28 筆) 約 1.4 秒 約 0.1 秒
一括点数補正(100 筆) 約 4.3 秒 約 1.4 秒
一括点数補正(1000 筆) 約 11 秒

体感で一番変わるのは隣地抽出だと思います。押してから結果が並ぶまでの間が、ほぼ 無くなりました。

何をしたか

原因は検索そのものではなく、データベースが毎回コンパイルしていた時間でした。

PostgreSQL には、複雑なクエリを機械語に変換してから実行する仕組み(JIT)があります。 これは大量の行を処理するときに効くもので、地図のように「広い範囲から少しだけ取り出す」 検索では、変換にかかる時間の方が長くなります。

隣地抽出の場合、1 回あたり 0.65 秒のうち 0.6 秒が変換時間でした。実際の検索は 0.03 秒で終わっています。この仕組みを止めたところ、そのまま 0.03 秒になりました。

点数補正の方は別の理由でした。三方界(3 筆以上が集まる角)を判定するとき、頂点 1 つに つき半径 220m ぶんの筆を候補として集めていました。実際に必要なのは 0.2m 以内の 筆だけなので、範囲を実寸に合わせ、距離の測り方も変えています。候補は 217 筆から 2 筆になりました。

判定の結果そのものは変えていません。変更前と変更後で同じ地域を計算し、抽出される 頂点が 1 つも変わらないことを確認してから反映しています(田村市 100 筆・高槻市 100 筆)。

半径を指定した抽出

地番出力 → 半径でまとめて抽出するとき、待たされることがありました。いまは半径 300m でも 0.4 秒ほどで返ります。

こちらは、絞り込みの順番を変えただけです。先に四角い範囲でざっくり切ってから、 正確な距離で測り直すようにしました。地図データの検索では、この順番で速さが大きく 変わります。

筆界未定の表示

表示設定 → 特殊な筆の着色で筆界未定地を出したとき、地図の動きが重くなることが ありました。こちらも同じ見直しをしています。

これから

今回いじったのは、地図データを検索する部分だけです。出力されるファイルの中身、 座標値、地番の並びは何も変わっていません。

ほかにも「ここが遅い」と感じる場面がありましたら、画面右下のフィードバックから お知らせください。どの操作でどれくらい待つか、が分かると探しやすくなります。