タイルのキャッシュ速度を上げる(TileStache)


13

TileStacheを使用してベクタータイルを提供しています。すべての設定を思いどおりに行います。データはPostgresに保存されており、VecTilesプロバイダーを使用してGeoJSONタイルを提供しています。

すべてのタイルをキャッシュして、タイルの配信を高速化したい。私はtilestache-seed.pyを使用してキャッシュをシードしています。複数のマシンでtilestache-seedを実行しています。Tilestache-seedはズームレベル13まで本当にうまく機能しましたが、その後、タイルをキャッシュするには時間がかかりすぎています。ズームレベル16の場合、キャッシュする5023772タイルがあり、各マシンで1日あたり100k〜200kのタイルしか取得できません。

タイルキャッシュを高速化するにはどうすればよいですか?tilestache-seed.pyを微調整してシードを高速化する方法はありますか?

更新:テーブルに空間インデックスを構築しようとしました(ジオメトリカラムとwhere句でデータをフィルタリングするために使用されるカラム)。それでも、タイルスピードの大幅な向上は見られませんでした。このレートでは、ズーム17のみで1か月かかりますが、この時間はズーム21に向かって指数関数的に増加するだけです。

更新2:マテリアライズドビューも作成しようとしましたが、パフォーマンスに目に見える変化はないため、データベースの最適化は機能していません。tilestache-seed.py自体を最適化するか、タイルをキャッシュする新しい方法を考案する必要があると思います。

ハードウェア情報 8つの異なるPCでキャッシングプロセスを実行しています。1つは32GB RAMを搭載したi7で、もう1つは4GB RAMを搭載したi3ですが、どちらもほぼ同じキャッシュ速度を提供します

回答:


5

15を超えるズームの場合、関心のある領域を小さな領域(境界ボックス)に分割すると、1台のマシンで複数のプロセスを実行することで、はるかに短い時間でそれらをキャッシュできるようになります。

たとえば、ズーム16(50,000,00タイル)をマシンで実行しており、平均タイルキャッシュ速度に従って、このプロセスは約40〜50日で完了します。これらのタイルを2つに分割し、マシン上で同時に実行すると、タイルスタッシーシードプロセスは単一のタイルキャッシュプロセスにプロセッサの約30%しか使用しないため、20〜25日でキャッシュできます。これは、私が同じ問題をかつて存在するため、これが私の問題を解決したためです。

マシン上で単一のプロセスまたは複数のプロセスを実行している場合、タイルキャッシュの速度には影響しませんが、CPU使用率は増加します。

これがあなたのお役に立てば幸いです。


これはこれまでのベストなことのように思えますが、これを試して、何が起こるかを確認します。
ハサンムスタファ

これは私がこれまでに見つけた最良の解決策ですが、理想的ではありませんが(tilestache-seed.pyを微調整したいと思います)、十分に機能します。
ハサンムスタファ

2

デフォルトでは、shp2pgsqlはインデックスを作成しません。-I空間インデックスを生成するために渡す必要があります。http://postgis.net/docs/manual-1.3/ch04.html#id435762

\d tablenamepsqlで実行して、テーブルにインデックスがあるかどうかを確認します。インデックスのリストには、「gist」(別のインデックスを選択していない場合)とジオメトリ列名のある行が必要です。

あなたは見るだけでなく実際の後に1を追加することができますhttp://postgis.net/docs/manual-1.3/ch03.html#id434676を(あなたが損失の大き恐怖に関するメモを聞かせていません)。

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );

おそらくクエリで非空間列も使用するため、通常はルックアップに使用される各列のインデックスを作成します。たとえば、SELECT * FROM roads WHERE priority = 3;thenのようなクエリpriorityが使用され、それにインデックスを追加すると、物事が大幅に高速化されます。

CREATE INDEX idx_roads_priority ON roads(priority);


Postgresでプラグイン「PostGIS Shapefile and DBF loader」を使用して、インデックスを作成しました:CREATE INDEX scale_geom_idx ON scale USING gist(geom)。、シェープファイルをインポートすると自動的に。追加のインデックスを作成する必要がありますか?
ハサンムスタファ

行がたくさんありますか?ベクタータイル生成は他の属性(データのサブセレクションなど)に依存していますか?
bugmenot123

両方ともはい、いくつかのテーブルにたくさんの行があり、POIテーブルには約975k行あり、Postgresにインポートする前の道路シェープファイルは8.5GBでした。私はクエリを使用してズームレベルに基づいてデータをフィルタリングします: "10": "SELECT wkb_geometry AS geometry、priority、name、route_num FROM roads WHERE priority IN(5,4,3)"これは道路を返すために使用しているクエリですズームレベル10で
ハサン・ムスタファ

次に、WHERE句で使用する各列にインデックスを作成します。必要に応じて、複数列のインデックスを作成することもできます。
bugmenot123

どのようにインデックスを作成する必要がありますか?
ハサンムスタファ

1

標準クエリを使用している場合は、クエリからマテリアライズドビューを作成し、そこからタイルを構築することもできます。http//www.postgresql.org/docs/9.3/static/sql-creatematerializedview.html

これにより、クエリを格納するテーブルが作成されます(将来、クエリを更新する可能性があります)。子MVに空間インデックスがあることを確認すると、可能な限り高速になります。

何が起こっているのかは、空間インデックスがありますが、一部のデータのみを選択しているということです。つまり、空間インデックスを使用しなくなっています。


タイルを作成するためにクエリを実行する11の異なるテーブルがありますが、これは11のマテリアライズドビューを作成する必要があるということですか?また、ズームレベルに基づいてクエリも変更されます。
ハサンムスタファ

十分に高速でない場合は、おそらく最も遅いselectステートメントのビューを作成することで改善できます。必要に応じて、複数のテーブルからのものを含め、selectステートメントのMVを作成できることに注意してください。
アレックスリース

したがって、すべてのクエリに基づいて単一のMVを作成すると、それは機能しますか?
ハサンムスタファ

それはできません。最も遅いクエリ、おそらく単一のズームレベル用に1つ作成し、それがiを高速化するかどうかを確認します。
アレックスリース

1
その場合、データベースの最適化は役に立ちません。深く見てください。
アレックスリース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.