Hack tốt nhất để nhập bộ dữ liệu lớn vào PostGIS là gì?


21

Tôi phải nhập Shapefiles lớn (> 1 triệu bản ghi) vào PostGIS và tôi đã tự hỏi về cách tốt nhất để làm điều đó.

nhập mô tả hình ảnh ở đây

Trong câu hỏi của tôi, tôi đã sử dụng từ "hack", thay vì công cụ, vì tôi nghĩ đây không phải là vấn đề của công cụ nào, mà là sử dụng tập hợp các bước hoặc cài đặt cấu hình nào. Cho đến nay, tôi đã thử các Nhổ plugin (QGIS), các shp2pgsql cụ PostGIS và GDAL ogr2ogr công cụ. Bạn có thể xem đánh giá đầy đủ của tôi về bài viết này . Cho đến nay, tôi thấy tất cả chúng thực sự không phản hồi, khi xử lý một tập dữ liệu lớn. Tôi đã tự hỏi nếu ai đó gặp phải một vấn đề tương tự, và nếu bạn có thể chia sẻ điều gì đó về cách tiếp cận.

Câu trả lời:


18

Tôi đã làm một bài kiểm tra cho bạn:

  • PostgreQuery 9.3
  • PostGIS 2.1
  • Windows 7
  • i7 3770@3,4 GHz bộ xử lý
  • GDAL 2.0-dev 64-bit
  • shapefile 1,14 triệu đa giác, kích thước tệp 748 MB

Lệnh Ogr2ogr:

ogr2ogr -f PostgreSQL PG: "dbname = 'databasename' host = 'addr' port = '5432' user = 'x' password = 'y'" test.shp --config PG_USE_COPY CÓ -nlt MULTIPOLYGON

Tổng thời gian: 1 phút 30 giây


Cảm ơn câu trả lời của bạn! Có vẻ như rất nhanh; Tôi nghĩ rằng nó có thể không hoạt động với tôi vì tôi đã không sử dụng cờ --config PG_USE_COPY YES; Tôi vừa quản lý để nhập nó một cách nhanh chóng bằng cách sử dụng: psql target-db -U <admin user> -p <port> -h <Tên đối tượng DB> -c "\ sao chép bảng nguồn từ 'source-table.csv' với DELIMITER ' , '"(Và sau đó xây dựng lại hình học), mà tôi đoán là một cách tiếp cận tương tự.
doublebyte

COPY nhanh hơn và sẽ là mặc định trong GDAL 2.0 khi dữ liệu được ghi vào các bảng mới. Khi chèn được sử dụng, kích thước mặc định của giao dịch (được kiểm soát với tham số -gt) chỉ có 200 tính năng trước phiên bản GDAL 1.11 khi được tăng lên 20000 tính năng. Giao dịch lớn hơn có nghĩa là giao dịch ít hơn và điều đó có thể mang lại một sự tăng tốc lớn.
dùng49584

4
Sử dụng COPY là chìa khóa và có thể bạn sẽ nhận được bản dịch thậm chí còn nhanh hơn với shp2pgsql và cờ -D. shp2pgsql -D test.shp | psdb testdb
Paul Ramsey

Paul, là shp2pgsql -D giống như SAO CHÉP? Không rõ ràng từ các tài liệu nói rằng điều này sử dụng định dạng "kết xuất", nhưng tôi không chắc điều đó có nghĩa gì đối với hoạt động tải lên (trái ngược với thao tác sao lưu / khôi phục). Tôi nhận thấy rằng shp2pgsql-gui có tùy chọn "Tải dữ liệu bằng cách sử dụng COPY thay vì INSERT", nhưng không có tùy chọn "kết xuất định dạng", vậy tôi có đúng không khi cho rằng chúng giống nhau?
Lee Hachadoorian

Có, -D giống như sử dụng COPY.
Darrell Fuhriman

9

Sau những gợi ý của người dùng49584 , Paul Ramsey và những thí nghiệm của riêng tôi. Tôi quyết định trả lời câu hỏi này.

Tôi không đề cập đến trong câu hỏi này rằng tôi đang nhập dữ liệu đến một máy chủ từ xa. (mặc dù nó được mô tả trong bài viết trên blog mà tôi đề cập đến). Các hoạt động như chèn, qua internet có thể bị trễ mạng. Có lẽ không liên quan khi đề cập rằng máy chủ này có trên Amazon RDS , điều này ngăn tôi từ ssh đến máy và chạy các hoạt động cục bộ.

Có được điều này, tôi đã thiết kế lại cách tiếp cận của mình, sử dụng chỉ thị "\ copy" để quảng cáo kết xuất dữ liệu vào một bảng mới. Tôi nghĩ rằng chiến lược này là một chìa khóa thiết yếu, cũng được đề cập đến các ý kiến ​​/ câu trả lời cho câu hỏi này.

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

Hoạt động này là cực kỳ nhanh chóng. Kể từ khi tôi nhập một csv, sau đó tôi có tất cả công việc điền vào hình học, thêm chỉ mục không gian, v.v. Nó vẫn rất nhanh, vì lúc đó tôi đang chạy truy vấn trên máy chủ .

Tôi đã quyết định điểm chuẩn cũng là những gợi ý từ người dùng49584 , Paul Ramsey . Tệp dữ liệu của tôi là một shapefile điểm với 3035369 bản ghi và 82 MB.

Cách tiếp cận ogr2ogr (sử dụng chỉ thị PG_USE_COPY) đã hoàn thành sau 1:03:00 m, vẫn còn * tốt hơn nhiều so với trước đây.

Cách tiếp cận shp2pgsql (sử dụng chỉ thị -D) đã hoàn thành chỉ trong 00:01:04 m.

Điều đáng nói là ogr2ogr đã tạo ra một chỉ mục không gian trong quá trình hoạt động, trong khi shp2pgsql thì không. Tôi phát hiện ra rằng nó là hiệu quả hơn để tạo ra các chỉ số sau khi làm việc nhập khẩu, chứ không phải là đầy hơi hoạt động nhập khẩu với kiểu yêu cầu này.

Kết luận là: shp2pgsql, khi được tham số hóa chính xác, cực kỳ phù hợp để thực hiện nhập khẩu lớn, cụ thể là những dịch vụ được cung cấp bởi Amazon Web Services.

Bảng không gian với hơn 3 triệu bản ghi, được nhập bằng shp2pgsql

Bạn có thể đọc một mô tả chi tiết hơn về những kết luận này, trên bản cập nhật của bài viết này .


Trước khi bạn buộc tội GDAL quá nhiều, hãy xem tài liệu. Ogr2ogr không liên quan, nó đúng hơn là trình điều khiển GDAL PostGIS và nó có một tùy chọn để vô hiệu hóa chỉ mục không gian gdal.org/drv_pg.html . Cách sử dụng với ogr2ogr là thêm -lco SPATIAL_INDEX = NO. GDAL cũng có một trình điều khiển khác cho PGDump có thể phù hợp với trường hợp sử dụng của bạn tốt hơn gdal.org/drv_pgdump.html . Có lẽ bạn cũng sẽ đề cập đến những điều này trong blog của bạn.
dùng49584

1
Chênh lệch tốc độ 1:03:00 và 00:01:04 giữa ogr2ogr và shp2pgsql là rất lớn. Tôi chắc chắn rằng đó là sự thật nhưng kết quả không thể khái quát. Nếu bạn kiểm tra với cơ sở dữ liệu PostGIS cục bộ, sự khác biệt sẽ ít hơn nhiều. Kết quả của bạn có nghĩa là một cái gì đó rất tệ cho ogr2ogr. Phiên bản GDAL nào bạn đã sử dụng? Nếu nó cũ hơn câu 1.11, bạn đã thử bằng cách tăng quy mô giao dịch bằng cách thêm một cái gì đó như -gt 60000 chưa?
dùng49584

1
Không có sự phình to nào để tạo trong chỉ mục trong quá trình nhập hơn là thực hiện sau đó. Lệnh được ban hành hoàn toàn giống nhau và thời gian cần chính xác như nhau. Ngoài ra, nếu bạn muốn shp2pgsql thêm chỉ mục, bạn chỉ cần thêm tùy chọn '-I'.
Darrell Fuhriman

Cảm ơn ý kiến ​​của bạn. Nghiên cứu trường hợp của tôi là một bản nhập vào Postgres chạy trên AWS, vì vậy điều quan trọng đối với tôi là giao dịch được thực hiện tốt qua mạng. Tôi đã sử dụng cờ PG_USE_COPY trên ogr2ogr, nhưng tôi đã không thử trình điều khiển PGDump, từ trang này có vẻ đầy hứa hẹn. Phiên bản GDAL của tôi là 1.7. Tôi nên điểm chuẩn mọi thứ bằng nhau về các điều kiện (có hoặc không có chỉ mục), nhưng từ những gì Daniel nói với tôi thì đây không phải là vấn đề, vì tôi tạo chỉ mục khá nhanh trong cơ sở dữ liệu ...
doublebyte

1
Có, nghiên cứu trường hợp là ổn nếu chúng được viết để người đọc không có cảm giác rằng kết quả có thể được khái quát hóa so với những gì họ thực sự đại diện. Ví dụ, thật tốt khi đề cập đến việc bạn đã thực hiện bài kiểm tra với phiên bản GDAL 5 tuổi và một số phát triển có thể hoặc không thể xảy ra kể từ đó. Phiên bản của bạn chắc chắn cần giá trị -gt lớn hơn để hoạt động tốt nhưng dù sao nó cũng không có ý nghĩa gì để kiểm tra với bất kỳ phiên bản GDAL cũ nào hơn 1.10.
dùng49584
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.