แฮ็คที่ดีที่สุดสำหรับการนำเข้าชุดข้อมูลขนาดใหญ่ไปยัง PostGIS คืออะไร


21

ฉันต้องนำเข้า Shapefiles ขนาดใหญ่ (มากกว่า 1 ล้านบันทึก) ลงใน PostGIS และฉันสงสัยว่าวิธีที่ดีที่สุดในการทำเช่นนั้น

ป้อนคำอธิบายรูปภาพที่นี่

ในคำถามของฉันฉันใช้คำว่า "แฮ็ค" แทนที่จะเป็นเครื่องมือโดยมีจุดประสงค์เพราะฉันคิดว่านี่ไม่ใช่เรื่องของเครื่องมือใด แต่เป็นชุดของขั้นตอนหรือการตั้งค่าที่จะใช้ จนถึงตอนนี้ผมได้ลองน้ำลายปลั๊กอิน (QGIS) ที่shp2pgsqlเครื่องมือ PostGIS และ GDAL ogr2ogrเครื่องมือ คุณสามารถดูรีวิวฉบับเต็มของฉันในนี้โพสต์ จนถึงตอนนี้ฉันพบว่าพวกเขาไม่ตอบสนองจริงๆเมื่อจัดการกับชุดข้อมูลขนาดใหญ่ ฉันสงสัยว่าใครบางคนประสบปัญหาที่คล้ายกันและถ้าคุณสามารถแบ่งปันบางสิ่งเกี่ยวกับวิธีการ

คำตอบ:


18

ฉันทำการทดสอบให้คุณ:

  • PostgreSQL 9.3
  • PostGIS 2.1
  • วินโดว 7
  • โปรเซสเซอร์ i7 3770@3.4 GHz
  • GDAL 2.0-dev 64- บิต
  • รูปร่างไฟล์ของ 1.14 ล้านรูปหลายเหลี่ยมขนาดไฟล์ 748 MB

คำสั่ง Ogr2ogr:

ogr2ogr -f PostgreSQL PG: "dbname = 'databasename' host = 'addr' port = '5432' ผู้ใช้ = 'x' รหัสผ่าน = 'y'" test.shp --config PG_USE_COPY YES -nlt MULTIPOLYGON

เวลาทั้งหมด: 1 นาที 30 วินาที


ขอบคุณสำหรับคำตอบ! ดูเหมือนจะเร็วจริงๆ ฉันคิดว่ามันอาจไม่ได้ผลสำหรับฉันเพราะฉันไม่ได้ใช้แฟล็ก --config PG_USE_COPY YES; ฉันเพิ่งจะนำเข้ามันอย่างรวดเร็วโดยใช้: psql target-db -U <ผู้ใช้ผู้ดูแลระบบ> -p <port> -h <ชื่ออินสแตนซ์ DB> -c "\ copy แหล่งตารางจาก 'source-table.csv' ด้วย DELIMITER ' , '"(แล้วสร้างเรขาคณิตใหม่) ซึ่งฉันคิดว่าเป็นวิธีที่คล้ายกัน
doublebyte

COPY เร็วขึ้นและจะเป็นค่าเริ่มต้นใน GDAL 2.0 เมื่อข้อมูลถูกเขียนลงในตารางใหม่ เมื่อแทรกจะใช้ขนาดเริ่มต้นของการทำธุรกรรม (ควบคุมด้วยพารามิเตอร์ -gt) เป็นเพียง 200 คุณสมบัติก่อน GDAL รุ่น 1.11 เมื่อมันเพิ่มขึ้นถึง 20,000 คุณสมบัติ ธุรกรรมที่ใหญ่กว่าหมายถึงธุรกรรมที่น้อยลงและสามารถเพิ่มความเร็วได้อย่างมาก
user30184

4
การใช้ COPY เป็นกุญแจสำคัญและคุณอาจได้รับการแปลที่รวดเร็วยิ่งขึ้นด้วย shp2pgsql และแฟล็ก -D shp2pgsql -D test.shp | psql testdb
Paul Ramsey

พอล shp2pgsql -D เหมือนกับ COPY หรือไม่ ไม่ชัดเจนจากเอกสารที่กล่าวว่าใช้รูปแบบ "การถ่ายโอนข้อมูล" แต่ฉันไม่แน่ใจว่าสิ่งนั้นหมายถึงการอัปโหลด (ตรงข้ามกับการดำเนินการสำรอง / กู้คืน) ฉันสังเกตเห็นว่า shp2pgsql-gui มีตัวเลือก "โหลดข้อมูลโดยใช้ COPY แทนที่จะเป็น INSERT" แต่ไม่มีตัวเลือก "รูปแบบการถ่ายโอนข้อมูล" ดังนั้นฉันจะแก้ไขให้ถูกต้องหรือไม่หากเป็นเช่นนั้น
Lee Hachadoorian

ใช่ -D เหมือนกับการใช้ COPY
Darrell Fuhriman

9

หลังจากคำแนะนำของผู้ใช้30184 , Paul Ramseyและการทดลองของฉันเอง ฉันตัดสินใจตอบคำถามนี้

ฉันไม่ได้พูดถึงคำถามนี้ว่าฉันกำลังนำเข้าข้อมูลไปยังเซิร์ฟเวอร์ระยะไกล (แม้ว่าจะอธิบายไว้ในบล็อกโพสต์ที่ฉันอ้างถึง) การดำเนินการเช่นส่วนแทรกผ่านทางอินเทอร์เน็ตอาจมีความล่าช้าของเครือข่าย อาจไม่เกี่ยวข้องกับการพูดถึงว่าเซิร์ฟเวอร์นี้อยู่ในAmazon RDSซึ่งป้องกันฉันจาก ssh ไปยังเครื่องและเรียกใช้การทำงานในเครื่อง

เมื่อนึกถึงสิ่งนี้ฉันจึงออกแบบวิธีการของฉันใหม่โดยใช้คำสั่ง "\ copy" เพื่อโปรโมตดัมพ์ของข้อมูลลงในตารางใหม่ ฉันคิดว่ากลยุทธ์นี้เป็นกุญแจสำคัญซึ่งก็อ้างถึงความเห็น / คำตอบสำหรับคำถามนี้

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

การดำเนินการนี้เร็วอย่างไม่น่าเชื่อ ตั้งแต่ผมนำเข้า CSV ผมก็มีการทำงานทั้งหมดของประชากรของรูปทรงเรขาคณิตเพิ่มดัชนีอวกาศ ฯลฯ มันยังคงเป็นที่น่าทึ่งอย่างรวดเร็วตั้งแต่ผมทำงานแล้วคำสั่งบนเซิร์ฟเวอร์

ฉันตัดสินใจที่จะเกณฑ์มาตรฐานนอกจากนี้ยังมีข้อเสนอแนะจากuser30184 , พอลแรมซีย์ ไฟล์ข้อมูลของฉันเป็นไฟล์รูปร่างจุดที่มีระเบียน 3035369 และ 82 MB

วิธี ogr2ogr (ใช้คำสั่ง PG_USE_COPY) เสร็จในเวลา 1:03:00 m ซึ่งยังดีกว่าเมื่อก่อนมาก

วิธี shp2pgsql (ใช้คำสั่ง -D) เสร็จในเวลา 00:01:04 m เท่านั้น

เป็นมูลค่าที่จะกล่าวว่า ogr2ogr สร้างดัชนีเชิงพื้นที่ระหว่างการดำเนินการในขณะที่ shp2pgsql ไม่ได้ ฉันพบว่ามันมีประสิทธิภาพมากขึ้นในการสร้างดัชนีหลังจากทำการนำเข้าแทนที่จะทำให้การดำเนินการนำเข้ามีปัญหากับคำขอประเภทนี้

ข้อสรุปคือ: shp2pgsql เมื่อมีการกำหนดพารามิเตอร์อย่างเหมาะสมนั้นเหมาะสมอย่างยิ่งสำหรับการนำเข้าขนาดใหญ่กล่าวคือสิ่งที่ต้องให้ความสะดวกในขณะที่ Amazon Web Services

ตารางเชิงพื้นที่ที่มีระเบียนมากกว่า 3 ล้านรายการนำเข้าโดยใช้ shp2pgsql

คุณสามารถอ่านรายละเอียดเพิ่มเติมของข้อสรุปเหล่านี้ในการปรับปรุงของนี้โพสต์


ก่อนที่คุณจะกล่าวหาว่า GDAL มากเกินไปให้ดูที่เอกสารประกอบ Ogr2ogr ไม่เกี่ยวข้องจะค่อนข้างไดรเวอร์ GDAL PostGIS และมันไม่ได้มีตัวเลือกสำหรับการปิดการใช้งานดัชนีเชิงพื้นที่gdal.org/drv_pg.html การใช้งานกับ ogr2ogr คือการเพิ่ม -lco SPATIAL_INDEX = NO GDAL ยังมีคนขับรถอีก PGDump ซึ่งอาจจะเหมาะกับกรณีการใช้งานของคุณดีขึ้นgdal.org/drv_pgdump.html บางทีคุณอาจพูดถึงสิ่งเหล่านี้ในบล็อกของคุณ
user30184

1
ความแตกต่างของความเร็ว 1:03:00 และ 00:01:04 ระหว่าง ogr2ogr และ shp2pgsql มีขนาดใหญ่มาก ฉันแน่ใจว่ามันเป็นเรื่องจริง แต่ผลลัพธ์ไม่สามารถสรุปได้ หากคุณทดสอบกับฐานข้อมูลท้องถิ่นของ PostGIS ความแตกต่างจะน้อยกว่ามาก ผลลัพธ์ของคุณหมายความว่ามีบางสิ่งไม่ดีสำหรับ ogr2ogr คุณใช้เวอร์ชัน GDAL รุ่นใด ถ้ามันเก่ากว่า v. 1.11 คุณลองโดยเพิ่มขนาดของธุรกรรมด้วยการเพิ่มบางอย่างเช่น -gt 60000 หรือไม่?
user30184

1
ไม่มีการขยายตัวเพิ่มเติมเพื่อสร้างดัชนีในการนำเข้ามากกว่าที่จะทำหลังจากนั้น คำสั่งที่ออกให้นั้นเหมือนกันทุกประการและใช้เวลาเท่ากันทุกประการ นอกจากนี้หากคุณต้องการ shp2pgsql เพื่อเพิ่มดัชนีคุณเพียงแค่ต้องเพิ่มตัวเลือก '-I'
Darrell Fuhriman

ขอบคุณสำหรับความคิดเห็นของคุณ กรณีศึกษาของฉันคือการนำเข้าสู่ Postgres ที่ทำงานบน AWS ดังนั้นจึงเป็นสิ่งสำคัญสำหรับฉันที่การทำธุรกรรมทำได้ดีผ่านเครือข่าย ฉันใช้แฟล็ก PG_USE_COPY ใน ogr2ogr แต่ฉันไม่ได้ลองไดรเวอร์ PGDump ซึ่งจาก manpage นั้นดูดี GDAL รุ่นของฉันคือ 1.7 ฉันควรเกณฑ์มาตรฐานทุกอย่างในความเท่าเทียมกันของเงื่อนไข (มีหรือไม่มีดัชนี) แต่จากสิ่งที่ Daniel บอกฉันว่านี่ไม่ใช่ปัญหาเนื่องจากฉันสร้างดัชนีค่อนข้างรวดเร็วในฐานข้อมูล ...
doublebyte

1
ใช่กรณีศึกษาตกลงถ้าพวกเขาเขียนขึ้นเพื่อให้ผู้อ่านไม่รู้สึกว่าผลลัพธ์นั้นสามารถสรุปได้ตามความเป็นจริง ตัวอย่างเช่นจะเป็นการดีที่จะพูดถึงว่าคุณทำแบบทดสอบ GDAL อายุ 5 ปีและการพัฒนาบางอย่างอาจเกิดขึ้นหรือไม่เกิดขึ้นตั้งแต่นั้นมา แน่นอนว่าเวอร์ชันของคุณต้องมีค่า -gt ที่ใหญ่กว่าสำหรับการทำงานที่ดี แต่อย่างไรก็ตามมันไม่สมเหตุสมผลเลยที่จะทดสอบกับรุ่น GDAL รุ่นเก่ากว่า 1.10
30184
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.