Các lựa chọn thay thế cho ogr2ogr để tải (các) tệp GeoJson lớn vào PostGIS


24

Tôi có tệp GeoJson 7GB mà tôi muốn tải vào cơ sở dữ liệu PostGIS. Tôi đã thử sử dụng ogr2ogr nhưng không thành công vì tệp quá lớn để ogr2ogr tải vào bộ nhớ và sau đó xử lý.

Có sự thay thế nào khác để tải tệp Geojson này vào PostGIS không?

Lỗi ogr2ogr tôi nhận được là:

LRI 2: CPLMalloc (): Hết bộ nhớ cấp phát -611145182 byte. Ứng dụng này đã yêu cầu Runtime chấm dứt nó theo một cách khác thường. Vui lòng liên hệ với nhóm hỗ trợ của ứng dụng để biết thêm thông tin.


1
Bạn đã thử tùy chọn "-gt" chưa? Theo mặc định, nhóm này có 200 tính năng cho mỗi giao dịch.
Pablo

Tôi đã không biết tùy chọn -gt và chưa từng thử nó trước đây. Tuy nhiên, tôi vừa thử chạy lại bằng tùy chọn -gt và không may gặp phải lỗi tương tự. Tôi cũng đã cố gắng sử dụng tùy chọn -WHERE để giới hạn số lượng tùy chọn có thể tìm kiếm, nhưng điều đó dường như cũng không giúp được gì.
RyanDalton

GDAL / OGR đã cải thiện việc đọc các tệp GeoJSON lớn trong 2.3.0, giúp giảm đáng kể chi phí bộ nhớ.
AndrewHarvey

Câu trả lời:


10

Mẫu mà bạn đã gửi cho thấy có thể phân tách tệp theo cách thủ công bằng trình chỉnh sửa như notepad ++

1) Đối với mỗi đoạn tạo một tiêu đề:

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

2) Sau tiêu đề, nhiều tính năng:

{"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) Hoàn thành đoạn với:

]}

EDIT - Đây là mã python sẽ chia tệp thành các phần có kích thước xác định (về số lượng tính năng):

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

Thật không may, JSON giống như XML, rất phù hợp để xử lý luồng nên hầu như tất cả các triển khai đều yêu cầu toàn bộ tập dữ liệu được tải trong bộ nhớ. Mặc dù điều này là ổn đối với các tập nhỏ trong trường hợp của bạn, không có lựa chọn nào khác ngoài việc chia tập dữ liệu thành các phần nhỏ hơn, có thể quản lý được.

Cải thiện giải pháp của Pablo, đây là một giải pháp không yêu cầu bạn thực sự mở và tải tệp vào trình chỉnh sửa và phân chia bằng tay nhưng cố gắng tự động hóa càng nhiều càng tốt toàn bộ quá trình.

Sao chép tệp json vào máy chủ Unix (linux, osx) hoặc cài đặt các công cụ cygwin trên Windows. Sau đó mở shell và sử dụng vim để xóa hàng đầu tiên và cuối cùng khỏi tệp:

$ vim places.json

dd để xóa dòng đầu tiên, sau đó SHIFT-G để di chuyển phần cuối của tệp, nhập lại dd để xóa dòng cuối cùng. Bây giờ gõ : wq để lưu các thay đổi. Điều này sẽ chỉ mất một vài phút.

Bây giờ chúng tôi sẽ khai thác sức mạnh tuyệt đối của unix để phân chia tệp thành nhiều phần dễ quản lý hơn. Trong loại vỏ:

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

Đi lấy bia. Điều này sẽ chia tệp thành nhiều tệp nhỏ hơn, mỗi tệp chứa 10000 dòng. Bạn có thể tăng số lượng dòng, miễn là bạn giữ nó đủ nhỏ để ogr2gr có thể quản lý nó.

Bây giờ chúng ta sẽ gắn đầu và đuôi vào mỗi tệp:

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

Đi lấy một cái snak. Hai lệnh đầu tiên chỉ đơn giản là tạo một tệp tiêu đề và chân trang với nội dung chính xác (chỉ để thuận tiện thực sự), trong khi lệnh cuối cùng sẽ thêm tiêu đề và chân trang vào mỗi đoạn mà chúng tôi chia ở trên và loại bỏ đoạn không có tiêu đề / không chân (để tiết kiệm không gian ).

Tại thời điểm này, bạn có thể hy vọng xử lý nhiều tệp địa điểm - *. Json với ogr2ogr:

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

1
Với phương pháp này, chúng ta sẽ không phải đảm bảo rằng các "khối" được tách ra ở cuối khối tính năng chứ? Vì tôi đã xử lý trước dữ liệu trong Python để thêm thông tin đầu trang & chân trang, nên tôi có thể thêm bộ đếm để phân đoạn dữ liệu. Tôi sẽ cho nó đi tiếp theo. Cám ơn vì sự gợi ý.
RyanDalton

Dữ liệu mẫu bạn cung cấp có một tính năng trên mỗi dòng, đó là lý do tại sao tôi đi với split -l . Nếu đó không phải là trường hợp với dữ liệu thực tế thì tôi sợ nó sẽ không hoạt động.
unicoletti

Vâng, tất nhiên bạn đúng, trong đó mỗi tính năng nằm trên một dòng riêng biệt. Tôi đã không nghĩ rằng một trong tất cả các cách.
RyanDalton

Để loại bỏ các dòng mà không cần mở tập tin. Xóa dòng đầu tiên: sed -i "1d" places.json Xóa 4 dòng đầu tiên: sed -i "1,4d" places.json Xóa 4 dòng cuối cùng: head -n -4 places.json > places2.json
egofer

2

Có thể tải dữ liệu của bạn với FME Desktop. Nó rất dễ.


Nó sẽ xử lý một tập tin cực lớn như thế này?
RyanDalton

Ví dụ: chia tệp thành nhiều tệp trước khi chuyển đổi. hjsplit.org Và nhập các tệp tin tức trong FME Desktop để nhập vào PostGIS.

1
có lẽ, và nếu nó không hiệu quả, bạn có thể hét lên để hỗ trợ :)
Simplexio

2

Cần phải thẳng thắn viết một trình đọc và ghi lười biếng bằng Python để chuyển đổi tệp Geojson của bạn sang định dạng shapefile nhỏ hơn nhiều hoặc trực tiếp thành SQL mà không thực hiện tất cả trong bộ nhớ. Sau khi được chuyển đổi, các công cụ PostGIS riêng có thể nhập các tập dữ liệu lớn. Hỗ trợ Geojson trong OGR tương đối mới và không có cờ nào để xử lý các tệp lớn.

Nếu bạn bằng cách nào đó có thể chia sẻ một đoạn có thể quản lý của tệp của bạn, tôi có thể giúp bạn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.