PostGIS में बड़े डेटासेट आयात करने के लिए सबसे अच्छा हैक क्या है?


21

मुझे PostGIS में बड़े शेपफाइल्स (> 1 मिलियन रिकॉर्ड) आयात करने हैं, और मैं इसे करने के सर्वोत्तम तरीके के बारे में सोच रहा हूं।

यहां छवि विवरण दर्ज करें

अपने प्रश्न में, मैंने टूल के बजाय "हैक" शब्द का उपयोग किया, क्योंकि मुझे लगता है कि यह इतना उपकरण का मामला नहीं है, लेकिन कौन सा कदम, या कॉन्फ़िगरेशन सेटिंग्स का उपयोग करना है। अब तक, मैं कोशिश की है थूक प्लगइन (QGIS), shp2pgsql PostGIS उपकरण और GDAL ogr2ogr उपकरण। आप इस पोस्ट पर मेरी पूरी समीक्षा देख सकते हैं । अब तक, मैं सभी को वास्तव में अनुत्तरदायी लगता हूं, जब एक बड़े डेटासेट के साथ काम करते हैं। मैं सोच रहा था कि क्या कोई इसी तरह के मुद्दे का अनुभव करता है, और यदि आप दृष्टिकोण के बारे में कुछ साझा कर सकते हैं।

जवाबों:


18

मैंने आपके लिए एक परीक्षा दी:

  • PostgreSQL 9.3
  • PostGIS 2.1
  • विंडोज 7
  • i7 3770@3.4 GHz प्रोसेसर
  • जीडीएएल 2.0-देव 64-बिट
  • 1.14 मिलियन पॉलीगॉन का आकार आकार, फ़ाइल का आकार 748 एमबी

Ogr2ogr कमांड:

ogr2ogr -f PostgreSQL PG: "dbname = 'databasename' host = 'addr' port = '5432' उपयोगकर्ता = 'x' पासवर्ड = 'y'" test.shp --confile PG_USE_COPY YES -nlt MULTIPOLYGON

कुल समय: 1 मिनट 30 सेकंड


आपके उत्तर के लिए धन्यवाद! यह वास्तव में तेज लगता है; मुझे लगता है कि यह मेरे लिए काम नहीं कर सकता है क्योंकि मैंने --config PG_USE_COPY YES ध्वज का उपयोग नहीं किया; मैं इसका उपयोग करके इसे जल्दी से आयात करने में कामयाब रहा: psql target-db -U <admin उपयोगकर्ता> -p <port> -h <DB आवृत्ति नाम> -c "\ copy स्रोत-तालिका 'source-table.csv से DELIMITER' , '' (और फिर ज्यामिति का पुनर्निर्माण), जो मुझे लगता है कि एक समान दृष्टिकोण है।
दोहरे-

COPY तेज है और GDAL 2.0 में डिफ़ॉल्ट होगा जब डेटा नई तालिकाओं के लिए लिखा जाता है। जब आवेषण का उपयोग किया जाता है, तो लेन-देन का डिफ़ॉल्ट आकार (-gt पैरामीटर नियंत्रित) GDAL संस्करण 1.11 से पहले केवल 200 सुविधाएँ थी जब इसे 20000 सुविधाओं तक बढ़ाया गया था। बड़े लेन-देन का मतलब कम लेनदेन होता है और इससे बहुत बड़ा स्पीडअप मिल सकता है।
user30184

4
COPY का उपयोग करना महत्वपूर्ण है, और आपको शायद shp2pgsql और -D ध्वज के साथ और भी तेज़ अनुवाद मिलेगा। shp2pgsql -D test.shp | psql testdb
पॉल रैमसे

पॉल, shp2pgsql -D COPY के समान है? डॉक्स से स्पष्ट नहीं है जो कहते हैं कि यह "डंप" प्रारूप का उपयोग करता है, लेकिन मुझे यकीन नहीं है कि अपलोड के लिए इसका मतलब क्या है (बैकअप / पुनर्स्थापना के विपरीत) ऑपरेशन। मुझे लगता है कि shp2pgsql-gui में "INSERT के बजाय COPY का उपयोग करके डेटा लोड करें" विकल्प है, लेकिन कोई "डंप प्रारूप" विकल्प नहीं है, तो क्या मैं यह मानने में सही हूं कि ये समान हैं?
ली हैचेरियन

हाँ, -D COPY का उपयोग करने के समान है।
डारेल फुहरिमन

9

User30184 के सुझावों के बाद , पॉल रैमसे और मेरे अपने प्रयोग। मैंने इस सवाल का जवाब देने का फैसला किया।

मैं इस प्रश्न में उल्लेख करने में विफल रहा कि मैं दूरस्थ सर्वर पर डेटा आयात कर रहा हूं। (हालांकि यह ब्लॉग पोस्ट में वर्णित है जिसका मैं उल्लेख करता हूं)। इंटरनेट पर आवेषण जैसे संचालन एक नेटवर्क विलंबता के अधीन हैं। शायद यह उल्लेख करना अप्रासंगिक नहीं है कि यह सर्वर अमेज़ॅन आरडीएस पर है , जो मुझे मशीन से ssh और स्थानीय रूप से संचालन चलाने से रोकता है।

इसे ध्यान में रखते हुए, मैंने अपने दृष्टिकोण को नए टेबल में डेटा के डंप को बढ़ावा देने के लिए "\ copy" निर्देश का उपयोग करते हुए फिर से इंजीनियर किया। मुझे लगता है कि यह रणनीति एक आवश्यक कुंजी है, जिसे इस प्रश्न की टिप्पणियों / उत्तरों पर भी संदर्भित किया गया था।

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

यह ऑपरेशन अविश्वसनीय रूप से तेज था। चूंकि मैंने एक सीएसवी को आयात किया था, इसलिए मेरे पास ज्यामिति को पॉप्युलेट करने, स्थानिक सूचकांक जोड़ने आदि के सभी कार्य थे, यह अभी भी उल्लेखनीय रूप से तेज था, क्योंकि मैं तब सर्वर पर प्रश्न चला रहा था ।

मैंने user30184 , पॉल रैमसे के सुझावों को भी मानने का फैसला किया । मेरा डेटा फ़ाइल 3035369 रिकॉर्ड और 82 एमबी के साथ एक बिंदु आकार का था।

Ogr2ogr दृष्टिकोण (PG_USE_COPY निर्देश का उपयोग करते हुए) 1:03:00 मीटर में समाप्त हुआ, जो अभी भी पहले से बहुत बेहतर है।

Shp2pgsql दृष्टिकोण (-D निर्देश का उपयोग करके) केवल 00:01:04 मीटर में समाप्त हुआ।

यह कहने योग्य है कि ऑग्रा 2ogr ने ऑपरेशन के दौरान एक स्थानिक सूचकांक बनाया, जबकि shp2pgsql ने नहीं किया। मुझे पता चला है कि आयात करने के बाद सूचकांक बनाने के लिए यह अधिक कुशल है , बजाय इस प्रकार के अनुरोध के साथ आयात ऑपरेशन को खिलाने के बजाय ।

निष्कर्ष यह है: shp2pgsql, जब ठीक से परिमाणित किया जाता है, तो बड़े आयात करने के लिए बहुत अच्छी तरह से अनुकूल है, अर्थात् उन लोगों को जो व्हिटिन अमेज़ॅन वेब सेवाओं के साथ हैं।

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 से अधिक पुराना है, तो आपने कुछ-जैसे 60000 जोड़कर लेनदेन का आकार बढ़ाकर एक कोशिश की है?
user30184

1
यह आयात में सूचकांक में बनाने के लिए कोई अतिरिक्त ब्लोट नहीं है, क्योंकि इसे बाद में करना है। जारी किया गया कमांड बिल्कुल वैसा ही है और समय बिलकुल समान है। इसके अलावा, यदि आप सूचकांक को जोड़ने के लिए shp2pgsql चाहते हैं, तो आपको बस '-I' विकल्प जोड़ने की जरूरत है।
डेरेल फ़ुहरिमन

आपकी टिप्पणियों के लिए आभार। मेरा केस स्टडी AWS पर चलने वाले पोस्टग्रैस का आयात था, इसलिए मेरे लिए यह महत्वपूर्ण था कि लेनदेन नेटवर्क पर अच्छा प्रदर्शन करे। मैंने ogr2ogr पर PG_USE_COPY ध्वज का उपयोग किया था, लेकिन मैंने PGDump ड्राइवर की कोई कोशिश नहीं की, जो मैनपेज से आशाजनक लगता है। GDAL का मेरा संस्करण 1.7 है। मुझे परिस्थितियों की समानता में (सूचकांक के साथ या बिना) सब कुछ बेंचमार्क करना चाहिए, लेकिन डैनियल मुझे जो बताता है, यह समस्या नहीं है, क्योंकि मैं डेटाबेस में बहुत जल्दी सूचकांक बनाता हूं ...
डबलबाइट

1
हां, केस स्टडी ठीक हैं यदि उन्हें लिखा गया है ताकि पाठकों को यह महसूस न हो कि परिणाम वास्तव में वे क्या प्रतिनिधित्व करते हैं, पर सामान्यीकृत किया जा सकता है। उदाहरण के लिए यह उल्लेख करना अच्छा होगा कि आपने 5 साल पुराने GDAL संस्करण के साथ परीक्षण किया था और उसके बाद से कुछ विकास हो सकता है, या नहीं हो सकता है। सुनिश्चित करने के लिए कि आपके संस्करण को अच्छा प्रदर्शन करने के लिए बड़े स्तर के मूल्य की आवश्यकता है, लेकिन वैसे भी 1.10 से अधिक पुराने GDAL संस्करण के साथ परीक्षण करने का कोई मतलब नहीं है।
user30184
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.