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).
và
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
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.