Multiprocessamento Python 3: tamanho ideal de chunk
Como encontro o tamanho ideal de bloco paramultiprocessing.Pool
instâncias?
Eu usei isso antes para criar um gerador den
objetos sudoku:
processes = multiprocessing.cpu_count()
worker_pool = multiprocessing.Pool(processes)
sudokus = worker_pool.imap_unordered(create_sudoku, range(n), n // processes + 1)
Para medir o tempo, eu usotime.time()
antes do snippet acima, inicializo o pool conforme descrito e converto o gerador em uma lista (list(sudokus)
) para acionar a geração dos itens (apenas para medição do tempo, sei que isso não faz sentido no programa final), então dedico um tempo usandotime.time()
novamente e faça a diferença.
Eu observei que o tamanho do pedaçon // processes + 1
resulta em tempos em torno de0,425 ms por objeto. Mas também observei que a CPU está totalmente carregada na primeira metade do processo; no final, o uso diminui para 25% (em um i3 com 2 núcleos e hyper-threading).
Se eu usar um tamanho menor de pedaçoint(l // (processes**2) + 1)
em vez disso, recebo momentos em torno de0,355 ms em vez disso, e a carga da CPU é muito melhor distribuída. Ele só tem alguns picos pequenos até ca. 75%, mas permanece alto por uma parte muito mais longa do processo antes de cair para 25%.
Existe uma fórmula ainda melhor para calcular o tamanho do bloco ou um método melhor para usar a CPU mais eficaz? Ajude-me a melhorar a eficácia desse pool de multiprocessamento.