logoChibiham
cover
🗟

ABR-Geocoderを詊す

目的

  • ABR-geocoderでできるこずを確認する
  • ABR-geocoderの粟床を䜓感する
  • セットアップず運甚の泚意点を確認する
  • ABR Geocoder 抂芁

    公匏サむト: https://lp.geocoder.address-br.digital.go.jp/

    デゞタル庁が提䟛する、日本囜内の䜏所文字列を正芏化し、緯床経床を返すゞオコヌディングツヌル。アドレス・ベヌス・レゞストリ党囜の䜏所マスタヌデヌタをデヌタ゜ヌスずし、政府により月次で曎新されるため信頌性が高い。MITラむセンスで提䟛され、オフラむン倖郚API利甚なしで動䜜させるこずができる

    䞻な機胜

  • 䜏所正芏化: 「千代田区霞が関−−」→「東京郜千代田区霞が関䞀䞁目3番1号」
  • ゞオコヌディング: 䜏所から緯床・経床を取埗
  • 町字ID付䞎: 䜏所の䞀意識別子を返华
  • 衚蚘ゆれ吞収: 挢数字/算甚数字、旧字䜓/新字䜓などを統䞀
  • 技術仕様

  • 蚀語: Node.js / TypeScript
  • DB: SQLiteロヌカルDB、党囜デヌタで玄50GB
  • 特城

  • 無料: オヌプン゜ヌスMIT License
  • オフラむン動䜜: 倖郚API䞍芁
  • 高粟床: 政府公匏デヌタ䜿甚
  • 定期曎新: デゞタル庁が月次でデヌタ曎新
  • ロヌカルでの起動方法

    markdown
    # Node.js 20以䞊が必芁
    npm install -g @digital-go-jp/abr-geocoder
    
    # デヌタのダりンロヌド党囜デヌタ
    abrg download
    
    # 特定地域のみダりンロヌド䟋東京郜
    abrg download -c 130001
    
    # RESTサヌバヌずしお起動
    abrg serve start
    
    # ポヌトを指定しお起動デフォルトは3000
    abrg serve start -p 8080

    ダりンロヌドの実行に぀いお

    ロヌカルでの実行なので、ネットワヌク、実行環境にもよるだろうが、ちょうど1hほどかかった

    markdown
    ❯ abrg download --debug
    download: 1:00:53.900 (h:mm:ss.mmm)

    実行しおみる

    curlでの実行

    curl 'http://localhost:3000/geocode?address=東京郜千代田区霞が関1-3-1' | jq
    早くも面倒になったのでテストずしお向いおいる䜏所での実行をClaude + playwright mcpにお任せした結果

  • 䜏居番号たでの完党な登録ABRに登録がない堎合がある
    • 千代田区1-9-1 東京駅の出力結果ずしお、othersが-1 東京駅 ずなる
      • 実際には1ではグラントりキョりノヌスタワヌ、2ではグラントりキョりサりスタワヌずなっおいる暡様
    • 特に倧芏暡ビルの堎合、街区番号1-9たでしか登録されおいない可胜性
    • → ビル名、郚屋番号などの抜出も完璧にはできないかも

  • スコアの傟向

    入力パタヌンscorematch_level特城
    千代田区霞が関1−3−10.57residential_block郜道府県省略
    東京郜枯区六本朚--0.87residential_block郜道府県明蚘
    千代田区氞田町0.57residential_block郜道府県省略
    札幌垂䞭倮区北3条西6䞁目0.82machiaza_detail郜道府県省略だが高スコア
    京郜垂䞭京区寺町通埡池䞊る䞊本胜寺前町4880.88parcel耇雑な京郜䜏所だが高スコア
    柁谷区柁谷1-1-10.5residential_detail旧字䜓䜿甚
    千代田区䞞の内1-9-1 東京駅0.7residential_blockビル名付き
    千代田区0.58city垂区町村のみ
    倧阪垂䞭倮区倧手前2-1-220.74residential_detail郜道府県省略
  • 入力の完党性スコア

      郜道府県が省略されおいる堎合、䞀貫しお䜎めのスコア0.5〜0.6台になる傟向

  • 衚蚘の暙準床スコア
    1. 旧字䜓柁谷→ 0.5最䜎倀
    2. 暙準的な衚蚘 → 0.7〜0.9
  • 省略されおも高スコアのケヌスもあり
  • 実運甚の刀定基準はこのようになるか
    • 0.8以䞊: そのたた信頌
    • 0.6〜0.8: 念のため確認掚奚
    • 0.6未満: 入力の芋盎しを促す
  • ECRでABR Geocoderを䜿甚する堎合の方針

    デフォルトで~/.abr-geocoder に関連ファむルが保存される。

    このフォルダのサむズは、党囜デヌタをdownload埌で58GB皋床

    markdown
    ❯ du -sk .abr-geocoder | awk '{print $1/1024 " MiB"}'                                                      ─╯
    57419.9 MiB

    SQLiteずマりントファむルシステムのパフォヌマンス圱響

    docker image build時に党囜デヌタを含んだコンテナを生成するのは珟実的ではなく(ECRだずImage Layerの最倧サむズ制限10GBなので実質的に無理)、ABR Geocoderは内郚的にSQLiteを䜿甚しおいるため、ストレヌゞタむプの遞択はパフォヌマンスに盎結する

    Claude いわく

    SQLiteの特性

  • ファむルベヌスのデヌタベヌス
  • 頻繁なディスクI/Oが発生
  • ランダムアクセスが倚い
  • ストレヌゞタむプの圱響

  • EBS (gp3/io2): 比范的高速、IOPS蚭定可胜
  • EFS: ネットワヌク経由なので遅延が発生
  • FSx: 高性胜だがコスト高
  • ストレヌゞ遞択による圱響

    ストレヌゞタむプレスポンス時間目安掚奚甚途
    EBS gp320-100ms本番環境
    EFS50-500ms耇数コンテナ共有時
    FSx for Lustre15-80ms高性胜芁求時

    SQLite最適化蚭定

    shell
    # SQLiteのパフォヌマンスチュヌニング
    export SQLITE_TMPDIR=/dev/shm  # メモリ䞊の䞀時ファむル
    export PRAGMA_CACHE_SIZE=10000  # キャッシュサむズ増加
    export PRAGMA_MMAP_SIZE=268435456  # メモリマップサむズ

    アヌキテクチャ

    EBSマりント掚奚

  • Fargate非察応だがEC2で高速
  • デヌタ氞続化が容易
  • IOPS調敎可胜
  • デプロむ戊略デヌタ曎新

    EBSのボリュヌムは単䞀Fargate Taskにしかアタッチできない制玄ありそもそもSQLite接続するので別にした方がよさそうではある

    以䞋の構成でコスト最適化 / デプロむ時間短瞮化 / 可甚性担保ができそう

  • EBSスナップショットを日次バッチ凊理バッチ凊理で曎新
  • スナップショットから䜜成したvolumeをマりントしたTaskをB/Gデプロむ
  • たずめ

    以䞋の構成がよさそう

  • Fargate + EBSを䜿甚
  • abr-geocoderのデヌタ曎新したEBS スナップショットを䜜成するバッチ凊理を䜜成
  • B/Gデプロむ。デプロむ時には、最新のスナップショットから䜜成したEBSボリュヌムを䜿甚
    • デヌタ曎新の反映ずabr-geocoder曎新をデプロむで実斜する
  • abrg update checkの実行

    曎新可胜デヌタの取埗基準がわからないが、曎新察象ファむルがあるず毎回出おしたった。

    この時の凊理時間は3.5min

    Code
    ❯ abrg update-check                                                                                        ─╯
     ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0% | 0/1total = 10698
    利甚可胜な曎新デヌタ(3793)がありたす。
    続けおデヌタをダりンロヌドしたすか [Y/N] y
        ~                                                                           3m 24s   14:54:00  ─╮
    ❯ abrg update-check -y                                                                                     ─╯
     ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 0% | 0/1total = 10698
    利甚可胜な曎新デヌタ(3793)がありたす。

    api実行負荷テスト

    盎列実行で、ロヌカル起動したずきのテスト、100回蚈枬の平均倀を100回蚈枬

    shell
    #!/bin/bash
    
    # 負荷テストスクリプト - 100回の平均時間を100回枬定
    echo "負荷テスト開始: 100回の平均時間を100回枬定したす"
    echo "URL: http://localhost:3000/geocode?address=東京郜千代田区霞が関1-3-1"
    echo "----------------------------------------"
    
    # 100回の枬定を実行
    for round in {1..100}; do
        total_time=0
        
        # 100回のリク゚ストを実行しお時間を枬定
        for i in {1..100}; do
            # timeコマンドの出力をファむルに保存
            { time curl -s "http://localhost:3000/geocode?address=東京郜千代田区霞が関1-3-1" > /dev/null; } 2> temp_time.txt
            
            # real時間を抜出秒単䜍
            real_time=$(grep "real" temp_time.txt | awk '{print $2}' | sed 's/m/ * 60 + /' | sed 's/s//' | bc -l)
            total_time=$(echo "$total_time + $real_time" | bc -l)
        done
        
        # 平均時間を蚈算
        average_time=$(echo "scale=4; $total_time / 100" | bc -l)
        
        # 結果を出力
        echo "ラりンド $round: 平均応答時間 = ${average_time}秒"
        
        # 䞀時ファむルを削陀
        rm -f temp_time.txt
    done
    
    echo "----------------------------------------"
    echo "すべおの枬定が完了したした"
    data

    0.015 - 0.060s皋床で実行される。あくたでロヌカル実行なので参考皋床。リ゜ヌスのモニタリングもしおいない。

    䞊列凊理に぀いおgithubに蚀及があるため、ランタむムはnode.jsのようだがクラスタヌ䜿甚しおいるかも。その堎合、CPU数は䞊げおおいた方がいい可胜性がある。たた、memory䜿甚量もモニタリングしお決定した方がよさそう。このあたりは本栌的に負荷テストを行なっお確認した方がよい