PostGIS के लिए बड़ी जियोसन फ़ाइल (ओं) को लोड करने के लिए ogr2ogr के विकल्प


24

मेरे पास एक 7 जीबी जियोसन फाइल है जिसे मैं पोस्टजीआईएस डेटाबेस में लोड करना चाहूंगा। मैंने ogr2ogr का उपयोग करने की कोशिश की है, लेकिन यह विफल हो जाता है क्योंकि फ़ाइल ogr2ogr के लिए मेमोरी में लोड होने और फिर प्रक्रिया के लिए बहुत बड़ी है।

क्या इस भू-फाइल फ़ाइल को PostGIS में लोड करने के लिए कोई अन्य विकल्प हैं?

मुझे जो ogr2ogr त्रुटि मिली है, वह है:

त्रुटि 2: CPLMalloc (): मेमोरी आवंटन में से -611145182 बाइट्स। इस एप्लिकेशन ने रनटाइम से असामान्य तरीके से इसे समाप्त करने का अनुरोध किया है। अधिक जानकारी के लिए कृपया आवेदन की सहायता टीम से संपर्क करें।


1
क्या आपने "-gt" विकल्प आज़माया है? डिफ़ॉल्ट रूप से यह प्रति ट्रांजेक्शन 200 सुविधाएँ देता है।
पाब्लो

मुझे -gt विकल्प के बारे में पता नहीं था और उसने पहले इसकी कोशिश नहीं की थी। मैंने अभी -gt विकल्प का उपयोग करके एक पुनः चलाने का प्रयास किया, हालांकि, और दुर्भाग्य से उसी त्रुटि का सामना करना पड़ा। मैंने खोज विकल्प की संख्या को सीमित करने के लिए -WHERE विकल्प का उपयोग करने का भी प्रयास किया, लेकिन यह भी मदद करने के लिए प्रतीत नहीं हुआ।
रयानडाल्टन

GDAL / OGR ने 2.3.0 में बड़ी जेजेन्सन फाइलों को पढ़ने में सुधार किया है जो मेमोरी ओवरहेड को बहुत कम करता है।
एंड्रयूहेयर

जवाबों:


10

आपके द्वारा भेजा गया नमूना दिखाता है कि नोटपैड ++ जैसे संपादक का उपयोग करके फ़ाइल को मैन्युअल रूप से विभाजित करना संभव हो सकता है

1) प्रत्येक chunk के लिए एक हेडर बनाएँ:

{"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) के साथ हिस्सा खत्म:

]}

EDIT - यहाँ अजगर कोड है जो परिभाषित आकार के टुकड़ों में फ़ाइल को विभाजित करेगा (सुविधाओं की संख्या में):

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 की तरह है, स्ट्रीम प्रोसेसिंग के लिए बुरी तरह से अनुकूल है, इसलिए लगभग सभी कार्यान्वयनों के लिए आवश्यक है कि पूरे डेटासेट को मेमोरी में लोड किया जाए। हालांकि आपके मामले में छोटे सेट के लिए यह ठीक है, लेकिन डेटासेट को छोटे, प्रबंधनीय विखंडू में तोड़ने के अलावा और कोई विकल्प नहीं है।

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

एक Unix host (linux, osx) पर json फाइल कॉपी करें या विंडोज पर cygwin टूल इंस्टॉल करें। फिर एक खोल खोलें और फ़ाइल से पहली और आखिरी पंक्ति हटाने के लिए विम का उपयोग करें :

$ vim places.json

पहली पंक्ति को हटाने के लिए dd टाइप करें , फिर फ़ाइल के अंत को स्थानांतरित करने के लिए SHIFT-G , अंतिम पंक्ति को हटाने के लिए फिर से dd टाइप करें। अब प्रकार : परिवर्तन को बचाने के लिए wq । यह बस कुछ ही मिनटों का समय लेना चाहिए।

अब हम फ़ाइल को अधिक प्रबंधनीय विखंडू में विभाजित करने के लिए यूनिक्स की सरासर शक्ति का उपयोग करेंगे। शेल प्रकार में:

$ 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

जाओ एक सनक पकड़ लो। पहले दो कमांड केवल हेडर और पाद फ़ाइल को सही सामग्री (सिर्फ सुविधा के लिए) के साथ बनाते हैं, जबकि अंतिम शीर्षकों में से प्रत्येक में हेडर और पाद लेख जोड़ देगा जिसे हम ऊपर विभाजित करते हैं और शीर्ष लेख रहित / पाद लेख रहित स्थान को हटाने के लिए (स्थान बचाने के लिए) )।

इस बिंदु पर आप उम्मीद कर सकते हैं कि आप कई स्थानों पर घूम सकते हैं- *। ogson2ogr के साथ जसन फाइलें:

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

1
इस पद्धति के साथ, हमें यह सुनिश्चित नहीं करना होगा कि फ़ाइल "चंक्स" को एक फीचर ब्लॉक के अंत में विभाजित किया गया था? चूंकि मैंने पहले से ही शीर्षलेख और पाद लेख जानकारी जोड़ने के लिए पायथन में डेटा को पूर्व-संसाधित किया था, इसलिए मुझे डेटा को चैंकाने के लिए एक काउंटर जोड़ने में सक्षम होना चाहिए। मैं दे दूंगा कि अगले जाओ। सलाह के लिये धन्यवाद।
रयानडाल्टन

आपके द्वारा प्रदत्त उदाहरण डेटा में प्रति पंक्ति एक विशेषता थी, इसीलिए मैं विभाजित -l के साथ गया । अगर वास्तविक डेटा के साथ ऐसा नहीं है तो मुझे डर है कि यह काम नहीं करेगा।
unicoletti

हां, निश्चित रूप से आप सही हैं, जहां प्रत्येक सुविधा एक अलग लाइन पर है। मैं नहीं सोच रहा था कि सभी तरह से।
रयानडाल्टन

फाइल को खोले बिना लाइनों को हटाने के लिए। पहली पंक्ति को sed -i "1d" places.json हटाएं : पहली 4 पंक्तियों को sed -i "1,4d" places.json हटा दें : अंतिम 4 पंक्तियों को हटा दें: head -n -4 places.json > places2.json
Augofer'

2

FME डेस्कटॉप से ​​अपना डेटा लोड करना संभव है। यह बहुत आसान है।


क्या यह इस तरह एक बहुत बड़ी फ़ाइल को संसाधित करेगा?
रेयानडाल्टन

उदाहरण के लिए, परिवर्तन से पहले फ़ाइल को कई फ़ाइलों में विभाजित करें। hjsplit.org और PostGIS को आयात करने के लिए FME डेस्कटॉप में समाचार फ़ाइलों को आयात करें।

1
शायद, और अगर यह
संदिग्ध है

2

पायथन में एक आलसी पाठक और लेखक को लिखने के लिए सीधे आगे होना चाहिए जो आपकी जियोजोन फ़ाइल को बहुत छोटे आकार के प्रारूप में या सीधे SQL में बदल देगा, यह सब स्मृति में किए बिना। एक बार परिवर्तित होने के बाद, मूल PostGIS उपकरण बड़े डेटा सेट आयात कर सकते हैं। OGR में जियोजोन समर्थन अपेक्षाकृत नया है और बड़ी फ़ाइलों को संभालने के लिए कोई झंडे नहीं हैं।

यदि आप किसी तरह अपनी फ़ाइल का प्रबंधनीय हिस्सा साझा कर सकते हैं तो मैं आपकी मदद कर सकता हूं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.