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.Jawaban:
Setiap koneksi IWorkspace (yaitu setiap koneksi basis data) memiliki afinitas utas. Dua utas tidak dapat berbagi ruang kerja yang sama. Anda dapat memiliki satu utas memiliki sumber daya lalu menyinkronkan akses, tetapi jika Anda akan menggunakan fungsi gp langsung, maka itu bahkan bukan pilihan.
Cara termudah (lumpuh) adalah membuat proses terpisah dan kemudian melakukan sinkronisasi multi proses (sebagai lawan dari sinkronisasi multithread). Bahkan kemudian Anda harus menyadari jenis ruang kerja yang mendasarinya. jika Anda tidak menggunakan arcsde (sumber data multi-pengguna) Anda mungkin akan menggunakan sumber data pengguna tunggal (seperti pribadi atau filegdb). Kemudian ingat itu berarti hanya satu proses yang dapat menulis sekaligus! Sinkronisasi (lumpuh) khas untuk skenario ini adalah bahwa setiap proses paralel menulis ke ruang kerja temp yang berbeda dan kemudian Anda menggabungkan semuanya ke ruang kerja tujuan Anda dalam satu proses tunggal.
sumber
Anda memiliki beberapa utas yang bersaing untuk sumber daya yang sama.
Coba pindahkan pernyataan 'impor arcpy' ke target multiprosesing. Anda akan memastikan arcpy bekerja dengan set variabel lingkungan dan memori itu sendiri.
Kedengarannya tidak masuk akal, tetapi meskipun Anda mengatur variabel lingkungan dalam metode target MultiProses, python masih menggunakan ruang memori bersama untuk mengelola modul arcpy dan karenanya setiap variabel yang Anda tetapkan.
Arcpy tidak aman untuk thread. Itu selalu dimaksudkan untuk digunakan dalam satu proses tunggal. Tetapi ada beberapa solusi.
Saran saya adalah mengimpor arcpy dalam target untuk proses baru.
sumber