最速の空間ストレージフォーマット?


8

どのような保存方法を使用すると、レンダリング用のマップベクトルを最も速く読み取ることができるのでしょうか。SHP?PostGres?SQLite?(これらは頻繁には変更されず、これらのベクトルに空間関数は必要ありません)。


1
話している機能はいくつありますか?
ロジャーD.

2
あなたの質問は、ボトルネックがデータを読み取るプロセスであることを暗示しているようです。私の経験では、少なくともMapServerでは、実際の負荷はレンダリングプロセス自体にあります。つまり、シェープファイルや空間データベースを使用しても大きな違いが生じるとは思いません。
dariapra 2011

@ロジャー-わからない 最高の解像度(州、郡、道路、河川)を使用した米国の地図。naturalearthdata.comからデータを取得
Nate

@ネイト、それが事実である、なぜあなたの地図のためにOSMまたはGoogleで読んだのか?次に、それらの上にオーバーレイしますか?米国全体を毎回ライブにすることは大きなプロセスです。次に、ネットワークパフォーマンス、ディスクIOパフォーマンス、CPUを考慮する必要があります。パフォーマンスに影響を与える可能性のある、または影響を与える可能性のある多くのものがあります。
DEWright

回答:


12

スピードテスト

このプレゼンテーション(2007年)には、MapServerのシェープファイルとデータベース(PostGIS)の非常に高速なテストがいくつかあります。

要約すれば:

  • 300のフィーチャのデータセットの場合、次の30のフィーチャに対するリクエストを実行するPostGISはシェープファイルよりも高速でした(ただし、シェープファイルインデックスを読み取るための修正によって変更された可能性があります)。
  • 10,000フィーチャのデータセットの場合、シェープファイルはわずかに高速でした。
  • 同時リクエストの場合、shapfileはより高速でした

また、時間の詳細も、ストレージフォーマットが重要な要素であるかどうかを判断するのに役立ちます。

                       PostGIS   Shapefile 
Start mapserv process  15ms      15ms
Load mapfile           3ms       3ms
Connect to DB          14ms      n/a
Query                  20ms      n/a
Fetch                  7ms       n/a
Draw                   11ms      28ms
Write Image            8ms       8ms
Network Delay          3ms       3ms

データベースを使用する場合は、データベース接続を再利用できるため、常にMapServerでFastCGIを使用してください。そうしないと、リクエストごとに新しい接続を作成する必要があります。

シェープファイルリーダーの実装

シェープファイル(およびデータベースからのデータ)を読み取る速度は、特定のコーディング実装によって異なります。

シェープファイルを開くMapServerのソースコードは、こちらにあります。コメントに続いて、インデックスを持つことの重要性を確認できます。通常、レコードを取得するにはファイルを一方向にしか読み取ることができませんが、インデックスを使用すると、双方向に読み取ることができます。

345   /*    Read the .shx file to get the offsets to each record in             */
346   /*    the .shp file.   

もう1つは、PyShpのPythonソースでシェープファイルを開く例です。ここでも、特定の形状を直接検索するためにインデックスがどのように使用されているかを確認できます。

検討する他の要因

データベースを使用するかどうかを決定するときは、DBF形式の制限(フィールドサイズの制限、nullサポートなし、テキストストレージの制限)も考慮する必要があります。

データベースは、データを保護する手段、ビューの簡単な結合と作成、ロギング、およびスタンドアロンファイルでは得られない他の多くの機能も提供します。


10

ダリアプラの言うこととは逆に、Maperitiveの開発における私の経験から、レンダリングの前にデータを実際にロードすることが最大のボトルネックであることがわかりました。保存されるデータセット全体の大きさと、一度にレンダリングしようとしているデータセットの大きさに大きく依存します。すべてをメモリにロードできる場合、シェープファイルはデータベースエンジンを使用するよりもおそらく優れています。


4
+1は、ボトルネックの形式が重要であることを指摘し、実際の経験からの情報を提供します。いい物。
whuber

ボトルネックがどこにあるかは、多くの変数に依存する興味深く、未解決の問題のようですが、おそらく、ワークロードの種類が重要です。MapServerを使用して一部のベクターレイヤーのレンダリングを高速化するために、シェイプツリーを使用していくつかのシェープファイルにインデックスを付けた後、パフォーマンスが大幅に向上しなかったことを覚えています。
dariapra 2011

2
@dariapra確かに、それはユースケースに大きく依存します。彼が一度にすべてのデータをロードできる場合、空間インデックスは実際には必要ありませんが、シェープファイルからのデータのロードは、SQLクエリを実行するよりもはるかに高速です。一方、フィルタリングする必要があるデータが大量にある場合は、シェープファイルではなくデータベースに賭けます。
Igor Brejc、2011

4

レンダリングにどのプログラムを使用しますか?これは結果に影響を与える可能性があります。とにかく、使用される空間インデックス(例:http : //mapserver.org/utilities/shptree.html)を備えたシェープファイルを持つこと は、多くの場合最速のテクニックです。それとは別に:アプリケーションによって異なりますが、レンダリングされた結果をキャッシュすることは、多くの場合、パフォーマンスを向上させるのに非常に役立ちます。


ありがとうございました。私は現在MapGuideを使用しており(まだオプションを検討中)、Mapserverを調べています。
ネイト

2

シェープファイルが最も速く、おそらくあなたの最善の策です。SQLデータベースにはオーバーヘッドがあり、大きな結果セットの戻りを管理します(データベースのデータ型からネイティブのデータ型への変換も遅くなります)。

読み取りを行うには、maptools.orgのオープンソースパッケージを使用してみてください。ArcGISツールは、目的に応じて作成されていますが、開始するには少しオーバーヘッドがあり、コストがかかります。

お役に立てれば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.