Saya bertanya-tanya apakah ada orang lain di komunitas di sini yang telah mencoba menggunakan multi-pemrosesan untuk analisis spasial. Yaitu saya mencoba untuk mengulangi melalui serangkaian raster, membuat pekerjaan multiprosesing untuk masing-masing dan menjalankannya melalui sejumlah langkah geoprosesing dalam satu fungsi def. Sesuatu di sepanjang garis
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)))
Sekarang proses multiprosesing berjalan, biasanya untuk batch pertama! Namun, saya terus mengalami beberapa kesalahan yang berbeda ketika mencoba beberapa dataset (lebih dari 4 file - yaitu 4 core multiprocessing) termasuk:
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).
dan
ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)
Perhatikan pada kesalahan pertama folder aneh yang dibuat (di lokasi OutFolderDir) yang terkait dengan statistik fokus yang hampir membuat replika yang tepat dari hasil akhir.
Pertanyaan saya didasarkan pada pengalaman Anda, apakah tidak mungkin membuat beberapa langkah geoprocessing dalam satu fungsi multiproses? Atau apakah saya perlu memasang langkah-langkah ini ke dalam langkah-langkah geoproses individu?
MEMPERBARUI
Masih mengatasi kesalahan serupa - memindahkan fungsi impor ke fungsi def telah menunjukkan hal itu
import arcpy
from arcpy.sa import *
tidak dapat membuat output dengan sintaks tambahan yang menambahkan bahwa impor * tidak diperbolehkan.
PEMBARUAN # 2
Saya tahu ini adalah jawaban yang terlambat tapi saya pikir mungkin bermanfaat bagi orang lain untuk referensi di masa depan untuk solusi saya yang memungkinkan multiprosesor untuk bekerja dengan arcpy. Masalah utama yang saya temukan setelah kembali ke masalah ini bukan kompetisi modul arcpy melainkan kompetisi atas scratchWorkspace yang digunakan ArcObjects untuk menyimpan file sementara. Oleh karena itu pertimbangkan menjalankan penghitung ke argumen parsing multiprosesing untuk membuat scratchWorkspace unik untuk setiap proses yaitu
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
Kemudian pada fungsi utama buatlah direktori sementara spesifik dan berikan scratchWorkspace unik untuk setiap tugas multiprosesing.
def main(RasterImage,OutFolderDir,Counter)
TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'% (Counter))
os.mkdir(TempFolder)
arcpy.scratchWorkspace = TempFolder
...
Harapan yang membantu dan terima kasih kepada Ragi atas saran awal untuk menggunakan ruang kerja temp yang terpisah - masih bingung mengapa ini awalnya tidak berhasil.
Sumber daya tambahan
R
. Ini bukan saran yang bagus untuk pekerjaan tujuan umum, karena mungkin lebih banyak masalah daripada nilainya, tetapi ketika Anda dapat menghemat waktu, berulang kali, upaya itu dapat membuahkan hasil.