Méthodes d'optimisation du traitement multcore dans ArcGIS

12

Je suis intéressé à apprendre des méthodes pour utiliser toute la puissance de traitement multicœur disponible sur un ordinateur de bureau. Arc indique que le géotraitement en arrière-plan permet à l'utilisateur d'utiliser plusieurs cœurs, cependant, les tâches doivent essentiellement attendre en ligne pour que la tâche précédente soit terminée.

Quelqu'un a-t-il développé des méthodes de géotraitement parallèles ou multithread en Arc / Python? Existe-t-il des goulots d'étranglement matériels qui empêchent le traitement multicœur sur des tâches individuelles?

J'ai trouvé un exemple intéressant dans Stackoverflow qui a attiré mon attention, bien qu'il ne s'agisse pas d'un exemple de géotraitement:

from multiprocessing import Pool
import numpy

numToFactor = 976

def isFactor(x):
    result = None
    div = (numToFactor / x)
    if div*x == numToFactor:
        result = (x,div)
    return result

if __name__ == '__main__':
    pool = Pool(processes=4)
    possibleFactors = range(1,int(numpy.floor(numpy.sqrt(numToFactor)))+1)
    print 'Checking ', possibleFactors
    result = pool.map(isFactor, possibleFactors)
    cleaned = [x for x in result if not x is None]
    print 'Factors are', cleaned
Aaron
la source
1
Dans mon expérience avec Arc, cela revient presque toujours à 1) diviser vos données en {nombre de cœurs}, à traiter et à réassembler ou 2) à tout lire en mémoire et à laisser x API gérer le threading. notez cela this is not meant to discourage.
valveLondon
Merci valveLondon. Peut-être que la nouvelle technologie Ivy Bridge et le GPU Kepler permettront des approches de traitement plus sophistiquées.
Aaron
Voici un lien vers un blog utile sur le multiprocessing python d'un ingénieur produit sur l'équipe d'analyse et de géotraitement ESRI. blogs.esri.com/esri/arcgis/2011/08/29/multiprocessing
Aaron

Réponses:

11

D'après mon expérience, le plus gros problème est la gestion de la stabilité. Si vous effectuez six semaines de traitement en une seule nuit, vous aurez également six semaines d'erreurs et de bugs inexplicables.

Une autre approche consiste à développer des scripts autonomes qui peuvent s'exécuter indépendamment et échouer sans causer de problèmes:

  • Divisez les données en morceaux qu'un seul cœur peut traiter en <20 minutes (tâches).
  • Créez un script Arcpy autonome qui peut traiter une seule tâche et est aussi simple que possible (travailleur).
  • Développer un mécanisme pour exécuter des tâches. Il existe de nombreuses solutions python préexistantes. Alternativement, vous pouvez créer le vôtre avec une simple file d'attente.
  • Écrivez du code pour vérifier que les tâches sont terminées. Cela peut être aussi simple que de vérifier qu'un fichier de sortie a été écrit.
  • Fusionnez les données ensemble.
Matthew Snape
la source
1
J'ai trouvé que cette approche, qui peut inclure l'utilisation du module de multitraitement, est bonne - certaines extensions, telles que spatial analyst, ne fonctionnent pas très bien si vous avez plusieurs copies de la même fonction exécutées simultanément, donc quelque chose comme ce que vous décrivez qui permet une forme de mise en file d'attente contrôlée par l'utilisateur (c.-à-d., évite de planifier ces tâches en même temps ou évite d'utiliser la même géodatabase à la fois pour des raisons de verrouillage de fichier) sera le meilleur.
nicksan