たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

ogr2ogrコマンドによるDB 投入を高速化する

大量のGeoJSONをpostGISに投入する時間を大幅に短縮することができたのでメモ

背景

筆者は、自宅でADSBを受信し、それをAWS上のwebサーバに送信し、S3に保存しています。QGIS等で分析するため、時々RDSで構築したPostGISに受信データを投入していました。一日でポイントの数が300万点、ファイルが1日1.2GBもあり、DBへの投入に苦労しています。 1秒毎のGeoJSONをPostGISへogr2ogrコマンドで投入していましたが、非常に時間がかかっていました(3時間以上)。並列で実施してもなかなか処理時間が短くなりませんでした。1日866400個のGeoJSONを1個ずつ投入では、ファイルIOでもそこそこ大きい...

ogr2ogrコマンドのオプション見直し

ogr2ogrコマンド実行時に--config PG_USE_COPY YESオプションを追加しました。 ogr2ogrのヘルプページの下のほうにPerformance Hintsとして記載されていました。

ogr2ogr -append -update -f "PostgreSQL" -a_srs "EPSG:4326" PG:"host=XXXX.rds.amazonaws.com user=postgres dbname=XXXX password=XXXX" "xxx.geojson" --config PG_USE_COPY YES -nln "adsb_log" --debug ON

ogr2ogrのページの説明はよくわからないですが、Postgresqlのcopyコマンドが裏で動いているようですね。

処理時間比較

1秒1Geojsonファイルの場合、1時間で3時間分のファイル(約10000個)を投入しましたが、まだまだ遅いです。 ファイルIOに問題がありそうです。 Geojsonを5分ぶんにマージした場合、4分まで縮められました。 更に、1日分を1つのファイルにまとめてみました。実行結果は以下です。

real   5m5.051s
user    4m56.140s
sys 0m6.023s

ある程度ファイルの個数が絞られるとそれ以上速くならないみたいですね。

なんとか自動化したい...

参考

ogr2ogr — GDAL documentation

https://gis.stackexchange.com/questions/109564/what-is-the-best-hack-for-importing-large-datasets-into-postgis