pgroutingが有効になっているDBのOSMデータに基づいて、pgr_ *ルーティング関数が永久に実行されるのはなぜですか


9

osm2po 4.7.7を使用して、ドイツのOSMデータセットをpgrouting DBにロードしました。すべてが正常に動作します。osm2poをconfigで設定すると、Javaパーツを介して魅力的に動作します。

* _2po_4pgrテーブルを問題なくインポートしました。* 2po_vテーブルもインポートされますが、このテーブルの関係は完全にはわかりません。

6mのエッジすべてを計算している間、かなりの時間(12000秒)実行されたpgr_createTopology関数を実行しました。これでうまくいくと思いましたが、それでも耐え難いほど遅いです。

何か忘れてしまったら教えてください。私は、Javaライブラリーの代わりにpgRoutingを使用することを考えていましたが、現時点では、パフォーマンスに関しては比較対象外です。


1
インデックスを作成しましたか、postgisメモリ変数を調整しましたか?createTopologyはデータセット全体に対して1回だけ実行されるため、そのパフォーマンスはそれほど重要ではありません。サイドノート。私はdigiroadデータセット(2Gの道路ネットワークなど)からフィンランド全体を取得し、最適化せずに最大250ミリ秒、通常125ミリ秒で結果を返しました。だから、今はもっと良いはずです
シンプレキシオ2013

osm2poスクリプトジェネレーターによって自動的に作成されたソース列とターゲット列にインデックスがあります。さらに必要ですか?私は変更work_mem /のmaintenance_work_memの再起動ギガバイト値、まだ変更なしに変数を。必要な起動スクリプトテンプレートはありますか?
ジョニーCusack 2013

1
うーん... createTopology()は何をしますか?つまり、osm2poはすでにOSM-Node-IDに基づいてトポロジーを作成しています。したがって、sthを実行する必要はありません。再び似ています。pgRouting(shortest_path&shortest_path_astar)では、作成された4pgrテーブルのみが必要です。それで全部です。
カーステン2013

フィンランドのデータセット、postgis 2.0.3、pgrouting 2.0.0-devができました。そして、これは遅いと言わざるを得ません。pgr_astar()を使用した場合、結果は常に1秒以上。私はこれが少し速くなるかどうかを確認します
シンプレキシオ'27

回答:


5

pgRoutingのパフォーマンスに関する問題は、新しいpgr_astarとpgr_dijkstraがグラフ全体を使用していることです(グラフがある場合は、それによってソリューションが保証されます)。より良いパフォーマンスを得るための簡単な解決策は、使用するグラフをより小さな領域に制限することです。解決できないグラフが作成される場合があるなど、独自の問題があります

 (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1 WHERE l1.source =7 OR l1.target = 12) 

ソースおよびターゲットコレクション上にBBOXを作成し、0.1度展開します。次に、同じクエリを使用して、pgr_クエリのグラフサイズを制限します

ダイクストラが1.2秒から最大65ミリ秒

SELECT  seq, id1 AS node, id2 AS edge, g.geom_way as the_geom
    FROM pgr_dijkstra(
            'SELECT id, source, target, cost FROM hh_2po_4pgr as r, 
            (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    ) as r INNER JOIN hh_2po_4pgr as g ON r.id2 = g.id ;

A * 2秒から最大50ミリ秒

SELECT seq, id1 AS node, id2 AS edge, cost
    FROM pgr_astar(
           'SELECT id, source, target, cost, x1,y1,x2,y2 FROM hh_2po_4pgr as r, 
             (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    );

osm2poはデータ(フィンランド最新)をpostgisテーブルにインポートするために使用されました。geom_way列に追加された要旨インデックス、およびデータベースのフルバキューム分析の実行。共有メモリ1G。workmem 512M


私はまだよくさえメモリを搭載したオーバー90秒などに設定VARS、バウンディングボックスと同じ考えを持っていた
ジョニー・キューザックを

380k行ありますか?あなたはおそらくルーティングテーブルに3M +行のようなものがありますか?
simplexio 2013

1
これは、Postgresでグラフ全体をキャッシュしないという主な問題の1つです。それはかなり速く動作します。しかし、現在の(テスト)状況でわずか5qps(1秒あたりのクエリ数)の巨大なボトルネックを作成する他のデータベーステーブルと接続する必要があります
Johnny Cusack

1
1M行のサブセットをRAMディスクにロードして比較しました。pgr_dijkstraは、コールドランで3秒かかります。@simplexioが提供するbboxサンプルを使用したpgr_astraは、コールドランに約900ミリ秒かかります。したがって、適切なパフォーマンスを得るには、すべてをRAMディスクに入れる必要があるようです。
ジョニーCusack

1
すごい!@kttiiのインデックスを使用して、私は今高速で実行しています!
Magno C

5

最後に、RAMディスクを使用してメモリに永続的に常駐する個別のテーブルスペースに(インデックスを含む)グラフ全体を配置するのが最善であるという結論に達しました。

Ubuntu 13.04でramdiskを設定するために、私は次の手順を使用し、それがかなりうまく機能していることを言わなければなりません(再起動/再起動後にメモリにデータを再ロードする手順が含まれています)。

来週、新しいSSD(1GB /秒の読み取り)を入手して、パフォーマンスを比較してみます。

私が見る限り、継続的なランダム読み取りが発生しているため、100万行以上のグラフを永続的にアクセスできるようにする唯一のソリューションです。


グラフ全体(インデックスを含む)をどのように作成しましたか?pgroutingのドキュメントには何もありませんでした。
Dennis Bauszus、2015

私はosm2poを使用しました。これはJavaコードのすばらしい部分です。osm2po.de
ジョニーキューザック

5

このガイドを使用して、空間データベースのインデックスを設定します。その要点は次のとおりです。

 1. create indexes on ID, source and target columns.
 2. create index using GIST on geom column.
 3. vacuum
 4. cluster on geom column
 5. analyze

私の_4pgrテーブルと_vertexテーブルでは、インポート後にソースとターゲットの列のみにインデックスがありました(osm2po-core-5.1.0)。


素晴らしい!セルフジョインを備えた完全なOSM南アメリカを使用して、約45秒から約15秒まで。
Magno C

すみません、私の間違いです。〜45秒から〜5ミリ秒!!!!!!
マグノC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.