Notei recentemente que o python está usando apenas um núcleo de cada vez para trabalhar. Existe uma maneira, talvez compilações ou comandos especiais, de fazê-lo usar todos os recursos (segundo núcleo)?
arcpy
arcgis-10.0
mahmoud hageer
fonte
fonte
Respostas:
Você pode usar subprocessos para tirar proveito de vários núcleos em um script Python, para que várias tarefas possam ser executadas em paralelo. Mas você não pode dividir uma única tarefa em vários núcleos. Veja uma explicação detalhada nesta FAQ: O ArcGIS 10 suporta processadores com vários núcleos e / ou sistemas operacionais de 64 bits?
Se você é um usuário experiente de Python, pode estar interessado na abordagem explicada nesta apresentação do Dev Summit 2014, chamada Geoprocessamento Paralelo Usando o Multiprocessamento Python e a Metodologia de Caminho Crítico , mas não permitirá que você use vários núcleos para a mesma tarefa.
Caso contrário, você terá que aguardar o lançamento do ArcGIS Pro (aplicativo totalmente de 64 bits) ainda este ano para testar o desempenho do multi-threading ... (ou tente o Beta agora)
fonte
Como alguns mencionados, não há suporte para multiprocessamento no ArcGIS Desktop. Ao falar sobre o processamento de conjuntos de dados GIS em um ambiente de área de trabalho, estou tentando descobrir se posso dividir um grande fluxo de trabalho em partes menores, que serão calculadas ao mesmo tempo em que carregam vários núcleos. Quase todos os casos devem ser investigados individualmente, pois o comportamento das ferramentas GP pode diferir significativamente.
Pense no que é mais rápido fazer ao resolver um simples problema de matemática. Qual é a maneira mais rápida de contar todos os números de 1 a 100?
1) somando os resultados um a um e adicionando a soma um ao outro de forma incremental (1 + 2 = 3, 3 + 3 = 6,6 + 4 = 10 e assim por diante). Um núcleo está trabalhando nessa tarefa.
2) divida os valores previamente em partes individuais e some os valores primeiro (1 a 30, 31 a 60 e 60 a 100). Três núcleos estarão funcionando ao mesmo tempo (o último passo seria somar três valores recebidos).
Como ferramentas GP diferentes são implementações de algoritmos diferentes com notação big-O diferente , você provavelmente precisará abordá-los de maneira diferente em termos de envio de múltiplos processos.
Um bom ponto de partida seria aprender como funciona a biblioteca de multiprocessamento no Python. Eu uso bastante.
Também notei que a execução de scripts Python a partir de uma linha de comando usando o Python de 64 bits geralmente resulta em uma execução mais rápida (comparada à execução do IDE, mas pode não ser o caso na sua máquina). O geoprocessamento em segundo plano foi introduzido na 10.1, mas tente executar os scripts Python com Python de 64 bits e veja como o desempenho está sendo afetado.
O ArcGIS Pro, nomeado em outra resposta, está disponível na versão beta 5 para download (lembre-se de que você precisaria ser um participante da Comunidade Esri Beta para enviar bugs e ter acesso a uma conta do ArcGIS Online for Organizations para poder execute o Pro).
fonte
Pypy é uma versão compatível do python que roda 4-5 vezes mais rápido que o CPython (o python "padrão").
Se você for corajoso o suficiente para construí-lo a partir da fonte, há uma ramificação que "pode executar vários threads independentes de CPU independentes no mesmo processo em paralelo". Isso significa que você obtém os benefícios do multi-threading sem precisar reescrever nenhum código.
fonte
Resposta simples é não. Melhor resposta é que depende.
Devido à implementação do CPython (o python mais comumente usado), é seguro assumir que seu Python não pode realmente tirar proveito do multithreading. Vejo:
http://en.wikipedia.org/wiki/Global_Interpreter_Lock
https://wiki.python.org/moin/GlobalInterpreterLock
Observe que o IO é imune ao GIL.
Agora você pode trabalhar sobre isso. Como outros já apontaram, você pode gerar subprocessos e a biblioteca de multiprocessamento pode ajudá-lo.
fonte
Não consigo resolver os problemas do ArcGIS, mas, ao processar várias tarefas usando o Python, você considerou um gerenciador de tarefas como o Celery (celeryproject.org)? Isso exigiria que você identifique diferentes tarefas de processamento, envie-as para um "gerente" para distribuição, execute "trabalhadores" que recebem tarefas do gerente, as processam e relatam resultados.
Isso não é trivial de implementar, mas tem uma flexibilidade incrível e permite que você aproveite ao máximo a capacidade de processamento (ou seja, use esses núcleos ociosos).
fonte