大きなGeoJsonファイルをPostGISに読み込むためのogr2ogrの代替


24

PostGISデータベースにロードしたい7GBのGeoJsonファイルがあります。私はogr2ogrを使用しようとしましたが、ファイルが大きすぎてogr2ogrがメモリにロードして処理できないため、失敗します。

このgeojsonファイルをPostGISに読み込む他の方法はありますか?

私が得るogr2ogrエラーは次のとおりです。

エラー2:CPLMalloc():メモリ不足-611145182バイトを割り当てています。このアプリケーションは、ランタイムに異常な方法で終了するように要求しました。詳細については、アプリケーションのサポートチームにお問い合わせください。


1
「-gt」オプションを試しましたか?デフォルトでは、トランザクションごとに200の機能をグループ化します。
パブロ

-gtオプションを知らなかったので、試したことはありませんでした。ただし、-gtオプションを使用して再実行を試みたところ、残念ながら同じエラーが発生しました。また、検索可能なオプションの数を制限するために-WHEREオプションを使用しようとしましたが、どちらも役に立たなかったようです。
ライアンダルトン

GDAL / OGRでは、2.3.0で大きなGeoJSONファイルの読み取りが改善され、メモリオーバーヘッドが大幅に削減されました。
-AndrewHarvey

回答:


10

送信したサンプルは、notepad ++などのエディターを使用してファイルを手動で分割できる可能性があることを示しています

1)チャンクごとにヘッダーを作成します。

{"type":"FeatureCollection","features":[

2)ヘッダーの後に多くの機能を配置します。

{"geometry": {"type": "Point", "coordinates": [-103.422819, 20.686477]}, "type": "Feature", "id": "SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237", "properties": {"website": "http://www.buongiorno.com", "city": "M\u00e9xico D.F. ", "name": "Buongiorno", "tags": ["mobile", "vas", "community", "social-networking", "connected-devices", "android", "tablets", "smartphones"], "country": "MX", "classifiers": [{"category": "Professional", "type": "Services", "subcategory": "Computer Services"}], "href": "http://api.simplegeo.com/1.0/features/SG_3TspYXmaZcMIB8GxzXcayF_20.686477_-103.422819@1308163237.json", "address": "Le\u00f3n Tolstoi #18 PH Col. Anzures", "owner": "simplegeo", "postcode": "11590"}},

3)以下でチャンクを終了します:

]}

編集-これは、定義されたサイズの断片にファイルを分割するPythonコードです(機能の数):

import sys

class JsonFile(object):
    def __init__(self,file):
        self.file = open(file, 'r') 
    def split(self,csize):
        header=self.file.readline()
        number=0
        while True:
            output=open("chunk %s.geojson" %(number),'w')
            output.write(header)
            number+=1
            feature=self.file.readline()
            if feature==']}':
                break
            else:
                for i in range(csize):
                    output.write(feature)
                    feature=self.file.readline()
                    if feature==']}':
                        output.write("]}")
                        output.close()
                        sys.exit("Done!")
                output.write("]}")
                output.close()

if __name__=="__main__":
    myfile = JsonFile('places_mx.geojson')
    myfile.split(2000) #size of the chunks.

19

残念ながら、JSONはXMLと非常によく似ており、ストリーム処理にはあまり適していないため、ほとんどすべての実装では、データセット全体をメモリにロードする必要があります。あなたのケースではこれは問題ありませんが、データセットを小さく管理しやすいチャンクに分割する以外のオプションはありません。

Pabloのソリューションを改善するために、実際にファイルを開いてエディターにロードし、手動で分割する必要はありませんが、プロセス全体を可能な限り自動化しようとします。

jsonファイルをUnixホスト(linux、osx)にコピーするか、Windowsにcygwinツールをインストールします。次にシェルを開き、vimを使用してファイルの最初と最後の行を削除します。

$ vim places.json

入力DD、その後、最初の行を削除するにはSHIFT-Gは、ファイルの末尾を移動するために入力DD最後の行を削除するには、再び。ここで:wqと入力して、変更を保存します。これにはせいぜい数分しかかかりません。

次に、unixの強力な機能を利用して、ファイルをより管理しやすいチャンクに分割します。シェルタイプで:

$ split -l 10000 places.json places-chunks-

ビールを飲みに行きます。これにより、ファイルは多数の小さなファイルに分割され、各ファイルには10000行が含まれます。ogr2grが管理できるように十分に小さく保つ限り、行数を増やすことができます。

次に、各ファイルの先頭と末尾を固定します。

$ echo '{"type":"FeatureCollection","features":[' > head
$ echo ']}' > tail
$ for f in places-chunks-* ; do cat head $f tail > $f.json && rm -f $f ; done

スナックを取りに行きます。最初の2つのコマンドは、正しい内容のヘッダーファイルとフッターファイルを作成するだけです(実際には便宜上)。最後のコマンドは、上で分割した各チャンクにヘッダーとフッターを追加し、ヘッダーレス/フッターレスチャンクを削除します(スペースを節約します) )。

この時点で、できれば多くのplaces- chunks -*。jsonファイルをogr2ogrで処理できます:

$ for f in places-chunks-*.json ; do ogr2ogr -your-options-here $f ; done

1
この方法では、機能ブロックの最後でファイルの「チャンク」が分割されていることを確認する必要はありませんか?ヘッダーとフッターの情報を追加するためにPythonでデータを前処理したため、データをチャンクするためのカウンターを追加できるはずです。次に試してみます。提案をありがとう。
ライアンダルトン

提供されたサンプルデータには1行に1つの機能があったため、split -lを使用しました。実際のデータに当てはまらない場合は、うまくいかないのではないかと心配しています。
ユニコレッティ

はい、もちろん正しいです。各機能は別々の行にあります。私はそれをずっと考えていませんでした。
ライアンダルトン

ファイルを開かずに行を削除します。最初の行をsed -i "1d" places.json 削除: 最初の4行をsed -i "1,4d" places.json 削除: 最後の4行を削除: head -n -4 places.json > places2.json
egofer

2

FME Desktopでデータを読み込むことができます。それは超簡単。


このような非常に大きなファイルを処理しますか?
-RyanDalton

たとえば、変換前にファイルを多数のファイルに分割します。hjsplit.orgそして、PostGISにインポートするために、FMEデスクトップにニュースファイルをインポートします。

1
おそらく、そしてそれがあなたにサポートするために叫ぶことができるなら:)
simplexio

2

geojsonファイルをはるかに小さいシェープファイル形式に変換するか、すべてメモリ内で実行せずに直接SQLに変換する、怠zyなリーダーとライターをPythonで書くのは簡単です。変換後、ネイティブPostGISツールは大きなデータセットをインポートできます。OGRのgeojsonサポートは比較的新しく、大きなファイルを処理するためのフラグはありません。

どうにかしてファイルの管理可能なチャンクを共有できるなら、私はあなたを助けることができます。


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