Çok İşleme Hataları - ArcGIS uygulaması


13

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

ESRI Çok İşlemli Blog

Python, Gis ve Şeyler Blogu


Bu öneri o kadar kaba ki bir cevapta resmileştirmek istemiyorum, ancak ArcGIS'i aynı anda birden fazla sanal makinede çalıştırmayı düşündünüz mü? (Her VM'de, her biri kendi dizin yapısına sahip ayrı bir yüklemeye ihtiyacınız olabilir.) Başka bir radikal düşünce, işlemin bazılarını dışarı atmaktır: örneğin, odak noktaları yapılabilir 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.
whuber

Yanıtlar:


7

Her IWorkspace bağlantısının (yani her veritabanı bağlantısı) iş parçacığı benzeşimi vardır. İki iş parçacığı aynı çalışma alanını paylaşamaz. Bir iş parçacığının kaynağa sahip olmasını ve sonra erişimi eşitlemesini sağlayabilirsiniz, ancak düz gp işlevlerini kullanacaksanız, bu bile bir seçenek değildir.

En kolay (topal) yol, ayrı işlemler oluşturmak ve daha sonra çoklu işlem senkronizasyonu yapmaktır (çok iş parçacıklı senkronizasyonun aksine). O zaman bile, temel çalışma alanı türünün farkında olmalısınız. arcsde (çok kullanıcılı bir veri kaynağı) kullanmıyorsanız, muhtemelen tek bir kullanıcı veri kaynağı (kişisel veya filegdb gibi) kullanırsınız. Öyleyse bunun bir seferde yalnızca bir işlem yazabileceği anlamına geldiğini unutmayın! Bu senaryolar için tipik (topal) eşitleme, her paralel işlemin farklı bir geçici çalışma alanına yazması ve daha sonra bunları tek bir işlemde hedef çalışma alanınızla birleştirmenizdir.


İyi öneriler ... Aslında, bu gönderiye eklememiş olmama rağmen, raster görüntü adına dayalı yeni bir klasör oluşturuyorum ve her işlem için çalışma alanını belirli bir dizine ayarlıyorum. Bunlar her bir raster görüntüsü için ayrı dosya dizinleridir ve ayrı coğrafi veri tabanları değildir (buna ihtiyacım var mı?). Sonra ben gerekli tüm dosyaları bulmak için basit bir os.walk işlevi kullanmayı planlamıştı onları benim istenen dosya geodatabase taşıyın.
BJEBN

Sadece tarama işlemleri mi yapıyorsunuz? Aynı coğrafi veri tabanına aynı anda okuma / yazma işlemleri var mı?
Ragi Yaser Burhum

Merhaba, üzgünüm, önceki ifade ile biraz belirsiz olabilirdi. Yalnızca tarama işlemleri (yeniden projelendirme, odak noktaları, yeniden sınıflandırma vb.) Ve tüm bu coğrafi işleme adımları her tarama görüntüsü için sıralı bir sırayla (veya olması gerekir) yapılır. Bu tarama görüntüleri benzersiz bir klasör çalışma alanına kaydedilir. Tüm orijinal rasterler aynı dizinden okuyor (aynı görüntüden değil), gönderilecek bireylerin işlerini yaratıyor.
BJEBN

Biraz yeniden düşündükten sonra her resim için belirli bir çalışma alanı belirtmeye çalıştım. DEM doğru şekilde yansıtılıyor, ancak bu odak noktası aşamasında yeni bir hataya neden oldu - "<Raster> tipi desteklenmiyor". Tüm dizin adresini belirtmeye çalıştım ama şansım yok. Öngörülen rasterleri sorunsuzca arcgis'e yükledim.
BJEBN

Bu, ilerlediğiniz anlamına geliyor. Odak noktaları için, dahili olarak nasıl uygulandığına bağlıdır. Yeni bir uygulama ise, bir çalışma alanı (yani bir Geodatabase) alabilir. Ancak, henüz yükseltilmemiş (!?!?!) Bu işlevlerden biriyse, izin verdiği çalışma alanı yalnızca bir klasör olabilir. Söz konusu GP işlevi için yalnızca bir klasör belirtin (geri kalanı için çalışma alanını saklayın) ve ne olduğunu görün.
Ragi Yaser Burhum

5

Aynı kaynak için rekabet eden birkaç iş parçanız var.

'İmport arcpy' ifadenizi çoklu işlem hedefine taşımayı deneyin. Arcpy'nin kendi ortam değişkenleri ve belleği ile çalıştığından emin olursunuz.

Kulağa saçma geliyor, ancak Multiprocess target yönteminde ortam değişkenleri ayarlasanız bile, python hala arcpy modülünü ve dolayısıyla ayarladığınız değişkenleri yönetmek için paylaşılan bir bellek alanı kullanıyor.

Arcpy iş parçacığı için güvenli değildir. Her zaman tek bir işlemde kullanılması amaçlanmıştır. Ancak geçici çözümler var.


Benim önerim yeni süreç için arcpy'ı hedef içine aktarmaktı.

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

Merhaba, tavsiyeniz için teşekkürler ... hala sorunum var gibi görünüyor. 'Çoklu işlem hedefine içe aktarım' denirseniz, if__name ... deyimi altında veya aslında def fonksiyonunda ima edersiniz. Düşündüğüm gibi def işlevi alma geçersizdi.
BJEBN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.