Hợp lý hóa mã Python cho dữ liệu lớn


34

Tôi có mã Python được thiết kế để lấy các shapefiles điểm thông qua quy trình làm việc sau:

  1. Hợp nhất điểm
  2. Tích hợp các điểm sao cho các điểm trong phạm vi 1 m của nhau trở thành một điểm
  3. Tạo lớp Feature, trong đó các điểm có z <10 được chọn
  4. Điểm đệm
  5. Độ phân giải đa giác đến raster 1m
  6. Phân loại lại, trong đó 1 - 9 = 1; NoData = 0

Mỗi shapefile có khoảng 250.000 đến 350.000 điểm bao gồm ~ 5x7 km. Dữ liệu điểm được sử dụng làm đầu vào đại diện cho vị trí của cây. Mỗi điểm (tức là cây) có giá trị "z" liên quan đại diện cho bán kính vương miện và được sử dụng trong quá trình đệm. Mục đích của tôi là sử dụng đầu ra nhị phân cuối cùng trong một quy trình riêng biệt để tạo ra một raster mô tả che phủ tán cây.

Tôi đã chạy thử nghiệm với bốn shapefiles và nó tạo ra raster 700 MB và mất 35 phút (bộ xử lý i5 & RAM 8GB). Thấy rằng tôi sẽ cần chạy quy trình này trên 3500 shapefiles, tôi sẽ đánh giá cao bất kỳ lời khuyên nào để hợp lý hóa quy trình (xem mã đính kèm). Nói chung, cách tốt nhất để đối phó với xử lý địa lý dữ liệu lớn là gì? Cụ thể hơn, có bất kỳ điều chỉnh nào cho mã hoặc quy trình làm việc có thể giúp tăng hiệu quả không?

Chỉnh sửa :

Thời gian (% tổng số) cho các nhiệm vụ xử lý địa lý:

  • Hợp nhất = 7,6%
  • Tích hợp = 7.1%
  • Tính năng cho Lyr = 0
  • Bộ đệm = 8,8%
  • Poly đến Raster = 74,8%
  • Phân loại lại = 1,6%

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

# Import arcpy module
import arcpy

# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")

# Script arguments
temp4 = arcpy.GetParameterAsText(0)
if temp4 == '#' or not temp4:
    temp4 = "C:\\gdrive\\temp\\temp4" # provide a default value if unspecified

Reclassification = arcpy.GetParameterAsText(1)
if Reclassification == '#' or not Reclassification:
    Reclassification = "1 9 1;NODATA 0" # provide a default value if unspecified

Multiple_Value = arcpy.GetParameterAsText(2)
if Multiple_Value == '#' or not Multiple_Value:
    Multiple_Value = "C:\\t1.shp;C:\\t2.shp;C:\\t3.shp;C:\\t4.shp" # provide a default value if unspecified

# Local variables:
temp_shp = Multiple_Value
Output_Features = temp_shp
temp2_Layer = Output_Features
temp_Buffer = temp2_Layer
temp3 = temp_Buffer

# Process: Merge
arcpy.Merge_management(Multiple_Value, temp_shp, "x \"x\" true true false 19 Double 0 0 ,First,#,C:\\#########omitted to save space

# Process: Integrate
arcpy.Integrate_management("C:\\gdrive\\temp\\temp.shp #", "1 Meters")

# Process: Make Feature Layer
arcpy.MakeFeatureLayer_management(temp_shp, temp2_Layer, "z <10", "", "x x VISIBLE NONE;y y VISIBLE NONE;z z VISIBLE NONE;Buffer Buffer VISIBLE NONE")

# Process: Buffer
arcpy.Buffer_analysis(temp2_Layer, temp_Buffer, "z", "FULL", "ROUND", "NONE", "")

# Process: Polygon to Raster
arcpy.PolygonToRaster_conversion(temp_Buffer, "BUFF_DIST", temp3, "CELL_CENTER", "NONE", "1")

# Process: Reclassify
arcpy.gp.Reclassify_sa(temp3, "Value", Reclassification, temp4, "DATA")

3
Có thể đáng để đưa vào một số mã thời gian hiệu suất để xác định xem phần lớn thời gian sẽ đi vào một hoặc một vài bước - để những người đó có thể tập trung vào để thử và tìm kiếm hiệu suất
PolyGeo

5
Tôi không nghĩ rằng bạn có nhiều tùy chọn để cải thiện hiệu suất nếu bạn tiếp tục sử dụng ArcPy. Có lẽ bạn có thể nhìn vào các công cụ khác để làm điều này? Các công cụ như FME hoặc có thể postgis?
tmske

3
Không rõ loại pixel nào đang được sử dụng, nhưng nếu đó là "Byte" (đúng là như vậy), thì dung lượng lưu trữ dữ liệu thô sẽ là 5000x7000 = 35Mb (~ 33,4 MB) mỗi raster, thực sự không lớn lắm. Tuy nhiên, kích thước tiếp theo của 3500 (kích thước thời gian?) Tăng tổng kích thước thô lên ~ 114GB.
Mike T

5
Mặc dù tôi không thể nói từ mô tả này thuật toán đang làm gì (hoặc dự định làm), trong hầu hết các trường hợp, bộ đệm điểm theo sau rasterization nên được thay thế bằng rasterization các điểm theo sau là một thống kê tiêu cự (thường là trung bình hoặc tổng). Kết quả sẽ giống nhau, nhưng bằng cách tránh các bước đệm và poly rasterization dài, nó sẽ thu được nhanh hơn nhiều . Tôi (chắc chắn) nghi ngờ có thể tăng tốc đáng kể nhưng không thể đưa ra lời khuyên cụ thể do sự mơ hồ của mô tả quy trình.
whuber

2
Bộ đệm xung quanh các điểm có kích thước thay đổi (dựa trên giá trị z của điểm). Tôi vẫn nghĩ rằng để làm thống kê tiêu cự, bạn sẽ phải phân chia các điểm kết quả theo giá trị z và thực hiện các chỉ số raster và tiêu cự trên mỗi bộ (sử dụng z làm bán kính trên một vùng lân cận tối đa làm chỉ số). Sau đó chạy Cell Statistics trên tất cả 9 raster với chỉ số tối đa để kết hợp các kết quả lại với nhau. (Mà vẫn có lẽ là nhanh hơn rất nhiều so với đệm và rasterize với một tập dữ liệu lớn.)
blord-castillo

Câu trả lời:


10

Một số thay đổi thuật toán sẽ giúp bạn.

Thực hiện lựa chọn của bạn trước khi hợp nhất hoặc tích hợp. Điều này sẽ cắt giảm đáng kể các chức năng sau này đắt nhất.

Hợp nhất và tích hợp đều tốn bộ nhớ, vì vậy bạn muốn tiếp tục loại bỏ các tính năng khi bạn đưa vào các lớp tính năng và cố gắng thực hiện việc hợp nhất của bạn trong cây nhị phân để giữ kích thước của sự hợp nhất và tích hợp xuống. ví dụ: đối với bốn shapefile bạn hợp nhất hai shapefile và tích hợp; hợp nhất hai shapefile và tích hợp; hợp nhất hai lớp tính năng kết quả và tích hợp.

Hàng đợi công việc của bạn bắt đầu như một hàng các tài liệu tham khảo shapefile. Bạn cũng có một hàng đợi kết quả để đặt kết quả vào. Phương thức run () cho nhân viên xử lý song song của bạn sẽ thực hiện các thao tác sau: Lấy hai mục ra khỏi hàng đợi. Nếu không có mục nào được thực hiện (hàng đợi trống), chấm dứt công nhân. Nếu một mục được thực hiện, đặt mục đó thẳng vào hàng đợi kết quả.

Nếu hai mục được thực hiện, đối với mỗi mục: nếu đó là shapefile, hãy chọn z <10 và tạo lớp tính năng in_memory; khác, nó đã là một lớp tính năng in_memory và bỏ qua bước lựa chọn. Hợp nhất hai lớp tính năng in_memory để tạo một lớp tính năng in_memory mới. Xóa hai lớp tính năng ban đầu. Thực thi tích hợp trên lớp tính năng mới. Đặt lớp tính năng đó vào hàng đợi kết quả.

Sau đó chạy một vòng lặp while. Vòng lặp bắt đầu với hàng đợi shapefile và kiểm tra độ dài lớn hơn 1. Sau đó, nó chạy hàng đợi thông qua các công nhân. Nếu hàng đợi kết quả có độ dài lớn hơn 1, vòng lặp while thực thi một xử lý song song khác chạy qua các công nhân cho đến khi hàng đợi kết quả là 1 lớp tính năng in_memory.

ví dụ: Nếu bạn bắt đầu với 3500 shapefiles, hàng đầu tiên của bạn sẽ có 3500 công việc. Thứ hai sẽ có 1750 việc làm. 875, 438, 219, 110, 55, 28, 14, 7, 4, 2, 1. Nút cổ chai lớn của bạn sẽ là bộ nhớ. Nếu bạn không có đủ bộ nhớ (và bạn sẽ hết bộ nhớ trong khi tạo hàng đợi kết quả đầu tiên nếu đó là trường hợp), sau đó sửa đổi thuật toán của bạn để hợp nhất hơn 2 lớp tính năng cùng một lúc, sau đó sẽ cắt giảm kích thước của hàng đợi kết quả đầu tiên của bạn để đổi lấy thời gian xử lý lâu hơn. Tùy chọn, bạn có thể viết các tệp đầu ra và bỏ qua bằng các lớp tính năng in_memory. Điều này sẽ làm bạn chậm lại đáng kể, nhưng sẽ vượt qua nút thắt bộ nhớ.

Chỉ sau khi bạn đã thực hiện hợp nhất và tích hợp trên tất cả các shapefile, kết thúc bằng một lớp tính năng duy nhất, thì bạn mới thực hiện bộ đệm, poly để raster và phân loại lại. Bằng cách đó, ba thao tác đó chỉ được thực hiện một lần và bạn giữ cho hình học của mình đơn giản.


+1 để sử dụng không gian làm việc in_memory nếu dữ liệu của bạn sẽ vừa với bộ nhớ. Nó tăng tốc đáng kể các hoạt động xử lý địa lý.
RyanDalton

Đây là thứ tốt. Tôi nghĩ rằng nó có thể thậm chí còn tốt hơn với một sơ đồ và một số psuedocode (hoặc mã thực!).
blah238

Vâng, tôi ước tôi có một chút thời gian để cam kết viết mã. Tôi cần phải viết lên một kịch bản demo xử lý song song mới nào.
blord-castillo

14

Điều đầu tiên tôi sẽ làm là giám sát việc sử dụng tài nguyên hệ thống của bạn bằng cách sử dụng một cái gì đó như Resource Monitor trong Windows 7 hoặc perfmon trong Vista / XP để cảm nhận xem bạn là CPU -, bộ nhớ - hay bị ràng buộc IO .

Nếu bạn bị ràng buộc về bộ nhớ hoặc IO, có rất ít khả năng bạn có thể làm ngoài việc nâng cấp phần cứng, giảm kích thước sự cố hoặc thay đổi hoàn toàn cách tiếp cận.

Nếu bạn xác định rằng bạn bị ràng buộc CPU, tôi sẽ thử nghiệm multiprocessingmô-đun hoặc một trong nhiều gói xử lý song song dựa trên Python khác để xem bạn có thể sử dụng nhiều lõi CPU hơn để tăng tốc hoạt động của mình không.

Bí quyết để đa xử lý và xử lý song song nói chung là tìm một sơ đồ phân vùng tốt:

  1. Cho phép bạn chia các đầu vào thành các bộ làm việc nhỏ hơn, sau đó kết hợp lại các kết quả theo cách có ý nghĩa,
  2. Thêm số lượng chi phí ít nhất (một số là không thể tránh khỏi so với xử lý nối tiếp) và
  3. Cho phép bạn điều chỉnh kích thước của bộ làm việc để sử dụng tốt nhất các tài nguyên của hệ thống để có hiệu suất tối ưu.

Bạn có thể sử dụng tập lệnh mà tôi đã tạo trong câu trả lời này làm điểm bắt đầu: Mã đại lộ Porting cho Sản xuất Bóng tối Xây dựng cho ArcPy / Python cho Máy tính để bàn ArcGIS?

Xem thêm bài đăng trên blog Công cụ địa lý ESRI này về chủ đề: Đa xử lý Python - Cách tiếp cận và cân nhắc

Tôi nghĩ rằng trường hợp của bạn sẽ còn khó khăn hơn do tính chất "hộp đen" của các công cụ bạn đang sử dụng, thay vì các mảng hình học hạt mịn hơn mà tôi đang làm việc. Có lẽ làm việc với mảng NumPy có thể có ích.

Tôi cũng đã xem qua một số tài liệu đọc thú vị nếu bạn muốn nhìn xa hơ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.