Buradaki topluluktaki herhangi birinin uzamsal analizler için çoklu işleme kullanmaya çalışıp çalışmadığını merak ediyordum. Yani ben bir dizi raster aracılığıyla yineleme, her biri için bir çok işlemli iş oluşturmak ve bunları bir def işlevi içinde bir dizi geoprocessing adımları üzerinden çalıştırmak çalışıyorum. Çizgisinde bir şey
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)))
Şimdi çok işlem, genellikle ilk parti için! Ancak, birkaç veri kümesi (4'ten fazla dosya - yani 4 çekirdek çoklu işlem) çalışırken birkaç farklı hatalarla karşılaşmaya devam ediyorum:
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).
ve
ERROR 999999: Error executing function.
Failed to copy raster dataset
Failed to execute (ProjectRaster)
İlk hatada, neredeyse nihai çıktının tam bir kopyasını oluşturan odak istatistikleriyle ilişkili oluşturulan (OutFolderDir konumunda) garip klasöre dikkat edin.
Sorum, deneyiminize dayanıyor Bir çok işlemli fonksiyonda birkaç adımda coğrafi işlem oluşturmak mümkün değil mi? Yoksa bu adımları kendi coğrafi işlem adımlarına mı eklemem gerekiyor?
GÜNCELLEME
Hala benzer hataları kodlamak - içe aktarma işlevlerini def işlevine taşımak,
import arcpy
from arcpy.sa import *
sözdizimi uyarısı eklenmiş bir * uyarısı içeren bir çıktı oluşturulamaz.
GÜNCELLEME # 2
Bunun geç bir yanıt olduğunu biliyorum, ancak çok işlemciliğin arcpy ile çalışmasına izin veren geçici çözümüme gelecekte başvurmak için başka birine fayda sağlayabileceğini düşündüm. Bu soruna döndükten sonra bulduğum temel sorun, arcpy modüllerinin rekabeti değil, ArcObjects'in geçici dosyaları kaydetmek için kullandığı scratchWorkspace üzerindeki rekabet. Bu nedenle, her işlem için benzersiz bir scratchWorkspace yapmak için çok işlemli ayrıştırma bağımsız değişkenine bir sayaç çalıştırmayı düşünün.
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
Daha sonra ana işlevde belirli bir geçici dizin oluşturun ve her çok işlemli göreve benzersiz bir scratchWorkspace atayın.
def main(RasterImage,OutFolderDir,Counter)
TempFolder = os.path.join(os.path.dirname(OutFolderDir),'Temp_%s'% (Counter))
os.mkdir(TempFolder)
arcpy.scratchWorkspace = TempFolder
...
Farklı geçici çalışma alanları kullanma önerisi için Ragi'ye yardımcı olur ve teşekkürler - hala neden işe yaramadığına şaşkın.
Ek kaynaklar
R
. Bunlar genel amaçlı işler için iyi bir öneri değildir, çünkü değerlerinden daha fazla sorun olabilirler, ancak bir seferde saatlerce tasarruf edebileceğinizde, çaba tekrar tekrar ödeyebilir.