Python usando apenas um núcleo de cada vez para trabalhar?


13

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)?


1
Se você estiver executando um processo em lote para tarefas repetidas e o script estiver fazendo a coisa certa e utilizar 100% de um núcleo para fazer algo útil, pode não ser tão perigoso. Inicie um segundo processo que execute o outro núcleo também em 100%. O efeito bruto pode ser melhor do que com um processo encadeado. A situação é diferente se você tiver apenas uma tarefa pesada para processar.
user30184

Isso já é discutido, veja este tópico para obter mais informações e soluções gis.stackexchange.com/questions/55048/…
iRfAn

Você seria capaz de editar sua pergunta para esclarecer se é sobre o Python em geral ou mais especificamente sobre o ArcPy (como mencionado por suas tags), por favor? Se for o último, você pode incluir alguns detalhes para demonstrar que esse é o caso, ou seja, como você percebeu isso?
PolyGeo

Respostas:


15

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)


4

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).


1

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.


0

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.


1
A E / S é imune, mas o mesmo ocorre com a maioria das funções implementadas em C, incluindo a maioria das ferramentas de GP e tudo numpy. O GIL é menos uma limitação em ambientes práticos de GIS do que se poderia pensar.
Jason Scheirer

0

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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.