3

後でユーザー検索に使用したい大量のデータがあります。現在、2 億のリソース (~50GB) があります。それぞれについて、緯度+経度があります。目標は、空間インデックスを作成して、空間クエリを実行できるようにすることです。そのため、PostgreSQL + PostGIS を使用する計画です。

私のデータはCSVファイルにあります。重複を挿入しないようにカスタム関数を使用しようとしましたが、何日も処理した後、あきらめました。データベースにすばやくロードする方法を見つけました.COPYを使用すると、2時間もかかりません.

次に、Geometry 形式で緯度 + 経度を変換する必要があります。そのためには、次のことを行う必要があります。

ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326))

確認したところ、2 億で 5000 万ポイントを持っていることがわかりました。したがって、すべてのポイントを格納するテーブル「TABLE_POINTS」と、リソースをpoint_keyで格納するテーブル「TABLE_RESOURCES」を用意するのが最善の方法だと思います。

したがって、一時テーブル「TABLE_TEMP」から「TABLE_POINTS」と「TABLE_RESOURCES」を入力し、重複を保持しないようにする必要があります。

「ポイント」については、次のことを行いました。

INSERT INTO TABLE_POINTS (point)
SELECT DISTINCT ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326))
FROM TABLE_RESOURCES

時間は覚えていませんが、数時間だったと思います。

次に、「リソース」を埋めるために、次のことを試しました。

INSERT INTO TABLE_RESOURCES (...,point_key)
SELECT DISTINCT ...,point_key
FROM TABLE_TEMP, TABLE_POINTS
WHERE ST_SetSRID(ST_MakePoint(longi::double precision,lat::double precision),4326) = point;

しかし、やはり数日かかり、クエリがどこまで進んでいるかを確認する方法はありません...

また、重要なことは、リソースの数が増え続けることです。現在、1 日あたり 100K ほど追加されているはずです。そのため、データへの高速アクセスを維持するためにストレージを最適化する必要があります。

そのため、ストレージのロードまたは最適化についてアイデアがあれば、大歓迎です。

4

2 に答える 2

0

効率的に作業するにはDISTINCT、重複を排除したい列 (緯度/経度の列、またはすべての列のセットなど) にデータベース インデックスが必要です。

したがって、最初にすべてのデータを一時テーブルに挿入してからCREATE INDEX(これは通常、挿入中にインデックスを維持するのにコストがかかるため、事前にインデックスを作成するよりも高速です)、その後でのみINSERT INTO ... SELECT DISTINCT.

が現在インデックスを使用しているかEXPLAIN <your query>どうかがわかります。SELECT DISTINCT

于 2014-07-12T17:23:17.597 に答える
0

最初にpostgresの最適化を検討してください(つまり、google postgres unlogged、walおよびfsyncオプション)。次に、一意であるためにポイントが本当に必要ですか? リソースとポイントを組み合わせたテーブルを 1 つだけ持つだけで、重複したルックアップが遅くなる可能性があるため、ポイントの重複を心配する必要はありません。

于 2013-01-21T15:34:01.713 に答える