Ho notato di recente che Python utilizza solo un core alla volta per funzionare. C'è un modo, forse build o comandi speciali, per farlo usare tutte le risorse (secondo core)?
Ho notato di recente che Python utilizza solo un core alla volta per funzionare. C'è un modo, forse build o comandi speciali, per farlo usare tutte le risorse (secondo core)?
Risposte:
È possibile utilizzare i sottoprocessi per sfruttare più core all'interno di uno script Python, in modo che diverse attività possano essere eseguite in parallelo. Ma non puoi dividere una singola attività su più core. Leggi una spiegazione dettagliata in questa FAQ: ArcGIS 10 supporta processori multi-core e / o sistemi operativi a 64 bit?
Se sei un utente esperto di Python, potresti essere interessato all'approccio spiegato in questa presentazione utente dal Dev Summit 2014, chiamato Parallel Geoprocessing utilizzando Python Multiprocessing e Critical Path Methodology , tuttavia non ti consentirà di utilizzare diversi core per lo stesso compito.
Altrimenti dovrai aspettare il rilascio di ArcGIS Pro (applicazione a 64 bit) entro la fine dell'anno per testare le prestazioni del multi-threading (o provare subito la Beta)
Come alcuni hanno già detto, non esiste supporto per il multiprocessing in ArcGIS Desktop. Quando parlo dell'elaborazione di set di dati GIS in un ambiente desktop, sto cercando di scoprire se posso dividere un grande flusso di lavoro in blocchi più piccoli che verranno calcolati contemporaneamente caricando più core. Quasi tutti i casi dovrebbero essere studiati individualmente poiché i comportamenti degli strumenti GP possono differire in modo significativo.
Pensa a cosa è più veloce da fare quando risolvi un semplice problema di matematica. Qual è il modo più veloce per contare tutti i numeri da 1 a 100?
1) sommando i risultati uno per uno e sommando l'uno con l'altro in modo incrementale (1 + 2 = 3, 3 + 3 = 6,6 + 4 = 10 e così via). Un core sta lavorando su questo compito.
2) dividere i valori in anticipo in singoli blocchi e sommare prima i valori lì (da 1 a 30, da 31 a 60 e da 60 a 100). Tre core funzioneranno contemporaneamente (l'ultimo passo sarebbe quello di sommare tre valori ricevuti).
Poiché diversi strumenti GP sono implementazioni di algoritmi diversi con notazione big-O diversa , probabilmente avresti bisogno di affrontarli in modo diverso in termini di invio di processi multipli.
Un buon punto di partenza sarebbe imparare come funziona la libreria multiprocessing in Python. Uso abbastanza pesantemente.
Ho anche notato che l'esecuzione di script Python da una riga di comando utilizzando Python a 64 bit di solito comporta una corsa più veloce (rispetto alla corsa dell'IDE, ma questo potrebbe non essere il caso sulla tua macchina). Il geoprocessing in background è stato introdotto in 10.1, ma provare a eseguire gli script Python con Python a 64 bit e vedere come le prestazioni sono influenzate.
ArcGIS Pro indicato in un'altra risposta è disponibile in versione beta 5 per il download (tieni presente che dovrai essere un partecipante della comunità Esri Beta per inviare eventuali bug e avere accesso a un account ArcGIS Online per organizzazioni per poter eseguire il Pro).
Pypy è una versione conforme di Python che funziona 4-5 volte più velocemente di CPython (il "standard" python).
Se sei abbastanza coraggioso da costruirlo dal sorgente, c'è un ramo che "può eseguire più thread indipendenti affamati di CPU nello stesso processo in parallelo". Ciò significa che ottieni i vantaggi del multi-threading senza dover riscrivere alcun codice.
La risposta semplice è no. La risposta migliore è che dipende.
A causa dell'implementazione di CPython (il python più comunemente usato), è sicuro che il tuo Python non possa effettivamente trarre vantaggio dal multithreading. Vedere:
http://en.wikipedia.org/wiki/Global_Interpreter_Lock
https://wiki.python.org/moin/GlobalInterpreterLock
Si noti che IO è immune al GIL.
Ora puoi lavorarci su. Come altri hanno sottolineato, puoi generare sottoprocessi e la libreria multiprocessore può aiutarti.
Non riesco a risolvere i problemi di ArcGIS, ma per quanto riguarda l'elaborazione di più attività tramite Python, hai considerato un task manager come Celery (celeryproject.org)? Ciò richiederebbe di identificare diverse attività di elaborazione, inviarle a un "responsabile" per la distribuzione, eseguire "lavoratori" che ricevono attività dal gestore, elaborarle e riportare i risultati.
Questo non è banale da implementare, ma ha un'incredibile flessibilità e ti consente di sfruttare appieno la capacità di elaborazione (ad esempio, utilizzare quei core inattivi).