Apa hack terbaik untuk mengimpor dataset besar ke PostGIS?

21

Saya harus mengimpor Shapefile besar (> 1 juta catatan) ke PostGIS, dan saya bertanya-tanya tentang cara terbaik untuk melakukannya.

masukkan deskripsi gambar di sini

Dalam pertanyaan saya, saya menggunakan kata "hack", bukan alat, sengaja karena saya pikir ini bukan masalah alat yang mana, tetapi yang mengatur langkah-langkah, atau pengaturan konfigurasi untuk digunakan. Sejauh ini, saya telah mencoba plugin SPIT (QGIS), alat Postgis shp2pgsql dan alat ogr2ogr GDAL . Anda dapat melihat ulasan lengkap saya di posting ini . Sejauh ini, saya menemukan semuanya benar-benar tidak responsif, ketika berhadapan dengan dataset besar. Saya bertanya-tanya apakah seseorang mengalami masalah yang sama, dan apakah Anda dapat membagikan sesuatu tentang pendekatan tersebut.

berlipat ganda
sumber

Jawaban:

18

Saya membuat tes untuk Anda:

  • PostgreSQL 9.3
  • PostGIS 2.1
  • Windows 7
  • prosesor i7 [email protected] GHz
  • GDAL 2.0-dev 64-bit
  • shapefile 1,14 juta poligon, ukuran file 748 MB

Perintah Ogr2ogr:

ogr2ogr -f PostgreSQL PG: "dbname = 'databasename' host = 'addr' port = '5432' pengguna = 'x' kata sandi = 'y'" test.shp --config PG_USE_COPY YES -nlt MULTIPOLYGON

Total waktu: 1 menit 30 detik

pengguna30184
sumber
Terima kasih atas jawaban anda! Tampaknya sangat cepat; Saya pikir itu mungkin tidak berhasil untuk saya karena saya tidak menggunakan flag --config PG_USE_COPY YES; Saya baru saja berhasil mengimpornya dengan cepat menggunakan: psql target-db -U <admin user> -p <port> -h <nama instance DB> -c "\ salin tabel-sumber dari 'source-table.csv' with DELIMITER ' , '"(dan kemudian merekonstruksi geometri), yang saya kira merupakan pendekatan yang serupa.
doublebyte
COPY lebih cepat dan akan menjadi default di GDAL 2.0 ketika data ditulis ke tabel baru. Ketika sisipan digunakan, ukuran transaksi standar (dikontrol dengan parameter -gt) hanya 200 fitur sebelum GDAL versi 1.11 ketika itu ditingkatkan menjadi 20.000 fitur. Transaksi yang lebih besar berarti lebih sedikit transaksi dan itu dapat menghasilkan percepatan yang besar.
user30184
4
Menggunakan COPY adalah kuncinya, dan Anda mungkin akan mendapatkan terjemahan yang lebih cepat dengan shp2pgsql dan flag -D. shp2pgsql -D test.shp | psql testdb
Paul Ramsey
Paul, apakah shp2pgsql -D sama dengan COPY? Tidak jelas dari dokumen yang mengatakan ini menggunakan format "dump", tapi saya tidak yakin apa artinya itu untuk operasi upload (sebagai lawan dari backup / restore). Saya perhatikan bahwa shp2pgsql-gui memiliki opsi "Muat data menggunakan COPY daripada INSERT", tetapi tidak ada opsi "dump format", jadi apakah saya benar dengan menganggap ini sama?
Lee Hachadoorian
Ya, -D sama dengan menggunakan COPY.
Darrell Fuhriman
9

Setelah saran dari user30184 , Paul Ramsey dan eksperimen saya sendiri. Saya memutuskan untuk menjawab pertanyaan ini.

Saya gagal menyebutkan dalam pertanyaan ini bahwa saya mengimpor data ke server jauh. (meskipun dijelaskan dalam posting blog yang saya rujuk). Operasi seperti sisipan, melalui internet tunduk pada latensi jaringan. Mungkin tidak relevan untuk menyebutkan bahwa server ini ada di Amazon RDS , yang mencegah saya dari ssh ke mesin dan menjalankan operasi secara lokal.

Dengan memikirkan hal ini, saya merekayasa ulang pendekatan saya, menggunakan arahan "\ copy" untuk mempromosikan dump data ke tabel baru. Saya pikir strategi ini adalah kunci penting, yang juga merujuk pada komentar / jawaban untuk pertanyaan ini.

psql database -U user -h host.eu-west-1.rds.amazonaws.com -c "\copy newt_table from 'data.csv' with DELIMITER ','"

Operasi ini sangat cepat. Karena saya mengimpor csv, saya kemudian memiliki semua pekerjaan mengisi geometri, menambahkan indeks spasial, dll. Itu masih sangat cepat, karena saya kemudian menjalankan kueri di server .

Saya memutuskan untuk patokan juga saran dari user30184 , Paul Ramsey . File data saya adalah shapefile titik dengan 3035369 catatan, dan 82 MB.

Pendekatan ogr2ogr (menggunakan arahan PG_USE_COPY) selesai pada 1:03:00 m, yang masih * jauh lebih baik dari sebelumnya.

Pendekatan shp2pgsql (menggunakan direktif -D) selesai hanya dalam 00:01:04 m.

Layak untuk mengatakan bahwa ogr2ogr membuat indeks spasial selama operasi, sementara shp2pgsql tidak. Saya menemukan bahwa jauh lebih efisien untuk membuat indeks setelah melakukan impor, daripada membengkak operasi impor dengan jenis permintaan ini.

Kesimpulannya adalah: shp2pgsql, ketika diparameterisasi dengan benar, sangat cocok untuk melakukan impor besar, yaitu yang akan diakomodasikan di dalam Layanan Web Amazon.

Tabel spasial dengan lebih dari 3 juta catatan, diimpor menggunakan shp2pgsql

Anda dapat membaca deskripsi yang lebih rinci dari kesimpulan ini, pada pembaruan posting ini .

berlipat ganda
sumber
Sebelum Anda terlalu banyak menuduh GDAL, bacalah dokumentasi. Ogr2ogr tidak terlibat, itu lebih merupakan driver GDAL PostGIS dan memang memiliki opsi untuk menonaktifkan indeks spasial gdal.org/drv_pg.html . Penggunaan dengan ogr2ogr adalah untuk menambahkan -lco SPATIAL_INDEX = TIDAK. GDAL juga memiliki driver lain untuk PGDump yang mungkin sesuai dengan kasus penggunaan Anda, lebih baik gdal.org/drv_pgdump.html . Mungkin Anda juga akan menyebutkan hal-hal ini di blog Anda.
user30184
1
Perbedaan kecepatan 1:03:00 dan 00:01:04 antara ogr2ogr dan shp2pgsql sangat besar. Saya yakin itu nyata tetapi hasilnya tidak dapat digeneralisasi. Jika Anda menguji dengan database PostGIS lokal perbedaannya akan jauh lebih sedikit. Hasil Anda berarti ada yang tidak beres untuk ogr2ogr. Versi GDAL mana yang Anda gunakan? Jika lebih tua dari v. 1.11 apakah Anda sudah mencoba dengan meningkatkan ukuran transaksi dengan menambahkan sesuatu seperti -gt 60000?
user30184
1
Ini bukan mengasapi tambahan untuk membuat dalam indeks di impor daripada melakukannya setelah itu. Perintah yang dikeluarkan persis sama dan waktu yang dibutuhkan persis sama. Juga, jika Anda ingin shp2pgsql menambahkan indeks, Anda hanya perlu menambahkan opsi '-I'.
Darrell Fuhriman
Terima kasih atas komentar anda Studi kasus saya adalah impor ke Postgres yang berjalan di AWS, jadi penting bagi saya bahwa transaksi dilakukan dengan baik melalui jaringan. Saya memang menggunakan flag PG_USE_COPY di ogr2ogr, tapi saya tidak mencoba driver PGDump, yang dari manpage terlihat menjanjikan. Versi GDAL saya adalah 1.7. Saya harus membandingkan semuanya dalam kondisi yang sama (dengan atau tanpa indeks), tetapi dari apa yang dikatakan Daniel kepada saya, ini bukan masalah, karena saya membuat indeks dengan cukup cepat dalam basis data ...
doublebyte
1
Ya, studi kasus OK jika sudah ditulis sehingga pembaca tidak merasa bahwa hasil dapat digeneralisasi untuk apa yang mereka wakili. Sebagai contoh akan lebih baik untuk menyebutkan bahwa Anda melakukan tes dengan versi GDAL 5 tahun dan bahwa beberapa pengembangan mungkin, atau mungkin tidak, terjadi sejak itu. Versi Anda tentu saja membutuhkan nilai -gt yang lebih besar untuk berkinerja baik tetapi bagaimanapun juga tidak masuk akal untuk menguji dengan versi GDAL yang lebih tua dari 1,10.
user30184