Freqüentemente, preciso aplicar uma função aos grupos de um muito grande DataFrame
(de tipos de dados mistos) e gostaria de tirar proveito de vários núcleos.
Posso criar um iterador a partir dos grupos e usar o módulo de multiprocessamento, mas não é eficiente porque cada grupo e os resultados da função devem ser separados para envio de mensagens entre processos.
Existe alguma maneira de evitar a decapagem ou mesmo evitar a cópia do DataFrame
completamente? Parece que as funções de memória compartilhada dos módulos de multiprocessamento são limitadas a numpy
arrays. Existem outras opções?
python
pandas
multiprocessing
shared-memory
user2303
fonte
fonte
Respostas:
Pelos comentários acima, parece que isso está planejado há
pandas
algum tempo (há também umrosetta
projeto de aparência interessante que acabei de notar).No entanto, até que todas as funcionalidades paralelas sejam incorporadas
pandas
, percebi que é muito fácil escrever ampliações paralelas eficientes e sem cópia de memória parapandas
usar diretamentecython
+ OpenMP e C ++.Aqui está um pequeno exemplo de como escrever um grupo por soma paralelo, cujo uso é algo assim:
e a saída é:
Nota Sem dúvida, a funcionalidade deste exemplo simples fará parte do
pandas
. Algumas coisas, no entanto, serão mais naturais paralelizar em C ++ por algum tempo, e é importante estar ciente de como é fácil combinar isso empandas
.Para fazer isso, escrevi uma extensão de arquivo de origem única simples cujo código segue.
Começa com algumas importações e definições de tipo
O
unordered_map
tipo C ++ é para somar por um único thread e ovector
é para somar por todos os threads.Agora para a função
sum
. Ele começa com visualizações de memória digitadas para acesso rápido:A função continua dividindo o semi-igualmente para os threads (aqui codificados para 4), e fazendo com que cada thread some as entradas em seu intervalo:
Quando os threads são concluídos, a função mescla todos os resultados (de diferentes intervalos) em um único
unordered_map
:Tudo o que resta é criar um
DataFrame
e retornar os resultados:fonte