Lỗi đa xử lý - Triển khai ArcGIS


13

Tôi đã tự hỏi nếu có ai khác trong cộng đồng ở đây đã cố gắng sử dụng đa xử lý cho các phân tích không gian. Cụ thể, tôi đang cố gắng lặp lại qua một loạt các trình quét, tạo một công việc đa xử lý cho từng công việc và chạy chúng thông qua một số bước xử lý địa lý trong một hàm def. Một cái gì đó dọc theo dòng

def net(RasterImage, OutFolderDir):
    arcpy.env.overwriteOutput = True  
    arcpy.env.workspace = OutFolderDir 
    DEM_Prj = DEM_Prj.tif

    try:
        arcpy.ProjectRaster_management(RasterImage, DEM_Prj....
        FocalStatistics(DEM_prj....)
        ...

if __name__ == '__main__':  
    InputFolder = r'C:\test\somepath'  
    Output = r'C:\test\somepath2'  
    arcpy.env.workspace = InputFolder  
    arcpy.env.scratchWorkspace = r'C:\test.gdb'    

    fcs = arcpy.ListRasters('*')
    pool = multiprocessing.Pool(4)   
    jobs = []                 
    for fc in fcs:
        rIn = os.path.join(InputFolder,fc)
        rOut = os.path.join(Output,fc[:-4])
        jobs.append(pool.apply_async(net,(rIn, rOut)))    

Bây giờ đa xử lý không chạy, thường là cho đợt đầu tiên! Tuy nhiên, tôi tiếp tục gặp phải một số lỗi khác nhau khi thử một số bộ dữ liệu (hơn 4 tệp - tức là đa xử lý 4 lõi) bao gồm:

ERROR 010302: Unable to create the output raster: C:\somepath\sr6f8~1\FocalSt_srtm1
ERROR 010067: Error in executing grid expression.
Failed to execute (FocalStatistics).

ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)

Lưu ý trong lỗi đầu tiên, thư mục lạ được tạo (ở vị trí OutFolderDir) được liên kết với các thống kê tiêu cự gần như tạo ra một bản sao chính xác của đầu ra cuối cùng.

Câu hỏi của tôi dựa trên kinh nghiệm của bạn là không thể tạo ra một vài bước xử lý địa lý trong một chức năng đa xử lý? Hay tôi cần xếp các bước này thành các bước xử lý địa lý riêng lẻ của họ?

CẬP NHẬT

Vẫn còn lỗi tương tự - di chuyển các chức năng nhập vào chức năng def đã chỉ ra rằng

import arcpy 
from arcpy.sa import *

không thể tạo đầu ra với cảnh báo cú pháp được thêm vào mà không được phép nhập.

CẬP NHẬT # 2

Tôi biết đây là một phản hồi muộn nhưng tôi nghĩ nó có thể có lợi cho người khác để tham khảo trong tương lai cho cách giải quyết của tôi cho phép đa xử lý hoạt động với arcpy. Vấn đề chính tôi tìm thấy sau khi trở lại vấn đề này không phải là sự cạnh tranh của các mô-đun phức tạp mà là cạnh tranh trên ScratchWorkspace mà ArcObjects sử dụng để lưu các tệp tạm thời. Do đó, hãy cân nhắc việc chạy bộ đếm vào đối số phân tích cú pháp đa xử lý để tạo một ScratchWorkspace duy nhất cho mỗi quy trình, nghĩa là

Counter = 0 
for fc in fcs:              
    rIn = os.path.join(InputFolder,fc)              
    rOut = os.path.join(Output,fc[:-4])                    
    jobs.append(pool.apply_async(net,(rIn, rOut,Counter)))            
    Counter += 1

Sau đó, trong hàm chính tạo một thư mục tạm thời cụ thể và gán một ScratchWorkspace duy nhất cho mỗi tác vụ đa xử lý.

def main(RasterImage,OutFolderDir,Counter)      
    TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'%  (Counter))      
    os.mkdir(TempFolder)      
    arcpy.scratchWorkspace = TempFolder      
    ... 

Hy vọng rằng sẽ giúp và cảm ơn Ragi về đề xuất ban đầu để sử dụng các không gian làm việc tạm thời riêng biệt - vẫn bị cản trở bởi lý do tại sao ban đầu nó không hoạt động.

Tài nguyên bổ sung

Blog đa xử lý ESRI

Blog Python, Gis và Stuff


Đề xuất này rất thô thiển Tôi không muốn chính thức hóa nó trong một câu trả lời, nhưng bạn đã xem xét việc chạy ArcGIS trong nhiều máy ảo chưa? (Bạn có thể cần một cài đặt riêng trong mỗi VM, mỗi VM có cấu trúc thư mục riêng.) Một suy nghĩ cấp tiến khác là đưa ra một số xử lý: ví dụ, có thể thực hiện các tiêu điểm R. Đây không phải là những gợi ý tốt cho công việc có mục đích chung, bởi vì chúng có thể rắc rối hơn giá trị của chúng, nhưng khi bạn có thể tiết kiệm hàng giờ liền, nhiều lần, nỗ lực có thể được đền đáp.
whuber

Câu trả lời:


7

Mỗi kết nối IWorkspace (tức là mỗi kết nối cơ sở dữ liệu) có ái lực luồng. Hai luồng không thể chia sẻ cùng một không gian làm việc. Bạn có thể có một luồng sở hữu tài nguyên và sau đó đồng bộ hóa quyền truy cập, nhưng nếu bạn sẽ sử dụng các hàm gp thẳng, thì đó thậm chí không phải là một tùy chọn.

Cách dễ nhất (khập khiễng) là tạo các quy trình riêng biệt và sau đó thực hiện đồng bộ hóa đa quy trình (trái ngược với đồng bộ hóa đa luồng). Thậm chí sau đó bạn nên biết về loại không gian làm việc cơ bản. nếu bạn không sử dụng arcsde (nguồn dữ liệu nhiều người dùng), bạn có thể sẽ sử dụng một nguồn dữ liệu người dùng duy nhất (như cá nhân hoặc filegdb). Sau đó, hãy nhớ rằng có nghĩa là chỉ có một quá trình có thể viết tại một thời điểm! Đồng bộ hóa (khập khiễng) điển hình cho các kịch bản này là mỗi quy trình song song ghi vào một không gian làm việc tạm thời khác nhau và sau đó bạn hợp nhất tất cả vào không gian làm việc đích của bạn trong một quy trình.


Đề xuất tốt ... Trên thực tế, mặc dù tôi chưa thêm nó vào bài đăng này, tôi đang tạo một thư mục mới dựa trên tên hình ảnh raster và đặt không gian làm việc cho mỗi quy trình vào thư mục cụ thể đó. Đây là các thư mục tệp riêng biệt cho mỗi hình ảnh raster và không tách rời cơ sở dữ liệu địa lý (tôi có cần điều đó không?). Sau đó tôi đã lên kế hoạch sử dụng một hàm os.walk đơn giản để tìm tất cả các tệp mà tôi cần để di chuyển chúng đến cơ sở dữ liệu địa lý tệp mong muốn của tôi.
BJEBN

Bạn chỉ làm hoạt động raster? Có bất kỳ chủ đề hoặc quá trình đọc / ghi vào cùng một cơ sở dữ liệu địa lý cùng một lúc không?
Ragi Yaser Burhum

Xin chào, xin lỗi tôi có thể đã không rõ ràng với tuyên bố trước đó. Chỉ các hoạt động raster (reproject, focalstats, phân loại lại, v.v.) và tất cả các bước xử lý địa lý đó được thực hiện theo thứ tự liên tục (hoặc cần phải có) cho mỗi hình ảnh raster. Những hình ảnh raster này được lưu vào một không gian làm việc của thư mục duy nhất. Tất cả các raster ban đầu đang đọc từ cùng một thư mục (không phải cùng một hình ảnh) vì điều đó tạo ra các công việc riêng lẻ được gửi.
BJEBN

Sau khi suy nghĩ lại một chút, tôi đã cố gắng chỉ định một không gian làm việc cụ thể cũng như cho từng hình ảnh. DEM đang được chiếu chính xác tuy nhiên điều này đã tạo ra một lỗi mới ở giai đoạn tiêu điểm - "loại <Raster> không được hỗ trợ". Tôi đã cố gắng chỉ định toàn bộ địa chỉ thư mục nhưng không có may mắn. Tôi đã tải các trình quét dự kiến ​​vào arcgis mà không có vấn đề gì.
BJEBN

Vâng, điều đó có nghĩa là bạn đang tiến về phía trước. Đối với các đầu mối, nó phụ thuộc vào cách nó được thực hiện trong nội bộ. Nếu đó là một triển khai mới, nó có thể mất một không gian làm việc (tức là Cơ sở dữ liệu địa lý). Tuy nhiên, nếu đó là một trong những chức năng chưa được nâng cấp (!?!?!) Thì không gian làm việc mà nó cho phép chỉ có thể là một thư mục. Đối với chức năng GP cụ thể đó, chỉ chỉ định một thư mục (giữ khoảng trống cho phần còn lại) và xem điều gì sẽ xảy ra.
Ragi Yaser Burhum

5

Bạn có một số chủ đề cạnh tranh cho cùng một tài nguyên.

Hãy thử di chuyển câu lệnh 'nhập Arcpy' của bạn vào mục tiêu của đa xử lý. Bạn sẽ đảm bảo Arcpy đang làm việc với tập hợp các biến môi trường và bộ nhớ.

Nghe có vẻ vô lý, nhưng mặc dù bạn đang đặt các biến môi trường trong phương thức đích Đa xử lý, python vẫn đang sử dụng một không gian bộ nhớ dùng chung để quản lý mô-đun arcpy và do đó, bất kỳ biến nào bạn đặt.

Arcpy không phải là chủ đề an toàn. Nó luôn được dự định sẽ được sử dụng trong một quy trình duy nhất. Nhưng có cách giải quyết.


Đề nghị của tôi là nhập Arcpy trong mục tiêu cho quy trình mới.

def _multiprocessing_target(args):
    import arcpy
    ...code

Xin chào, cảm ơn lời khuyên của bạn ... mặc dù tôi dường như vẫn có vấn đề. Khi bạn tham khảo'import arcpy vào mục tiêu của đa xử lý ', bạn có ngụ ý dưới câu lệnh if__name ... hoặc thực sự trong hàm def. Theo tôi nghĩ nhập trong hàm def là không hợp lệ.
BJEBN
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.