Como carrego o paralelismo de equilíbrio em tarefas em que algumas tarefas são muito caras?
Eu tenho uma lista de objetos que precisam ser processados. Digamos que a lista seja uma lista de todos os clientes e preciso executar um cálculo intensivo da CPU em todos eles. Embora antes e depois desse cálculo eu precise buscar e confirmar dados novamente em um banco de dados, portanto não é uma tarefa puramente CPU.
então o que eu faço é
Parallel.ForEach(list, action);
Onde a ação é literalmente
1 Fetch customer data
2 Process calculate (time and memory intensive task)
3 Commit back customer data
O código costumava funcionar bem, mas ultimamente, às vezes, quandomúltiplo clientes com muitoalto número de registros são processados, o sistema fica sem memória.
Então, existe uma maneira de equilibrar isso? A maioria dos clientes é processada rapidamente, mas são poucos os que retiram todos os recursos. Posso evitar que alguns deles corram juntos?
Uma maneira de implementar isso é classificando a lista com base no tamanho e, em seguida, tente escolher o primeiro e o último item e controlar o paralelismo, mas desejando ver quais opções tenho aqui.