Muito top sua abordagem. Precisamos sair do básico mesmo e não há muitos vídeos avançados no youtube. Inscrito. Sugestão de vídeos que não encontrei no canal: Generics, Reflection e tbm seria top um vídeo sobre rotinas executadas em paralelo pelo Hangfire ou outra biblioteca. Valeuu
Uma das melhores aulas, top d++++, só fiquei com a dúvida de como descubro quantos nucleos lógicos temos no meu serviço como disponivel, mas isso vou de pesquisa agora.
E ae tudo bem ? Você descobre isso a partir das especificações do seu processador, no meu caso é um Ryzen 7 8 núcleos e 16 threads, o número de threads que vale para definir o limite máximo de processadores, como no exemplo você pode limitar essa quantia configurando a instância antes de usá-la.
Eu gostei muito do vídeo eu só tenho uma dúvida se eu tenho um sistema com alta volumetria onde vou precisar cadastrar milhoes de registros. Nesses casos o mais recomendado seria usar o paralelismo ?
Olá tudo bem ? Essa abordagem de paralelismo é interessante mas sempre deve ser as últimas opções devido a complexidade de compreender e organizar as estruturas, mas sim pode ser uma aliada se bem implementada. Qualquer dúvida estou a disposição.abracos
Primeiramente parabéns pela aula e ganhou mais 1 like e mais 1 inscrito. O exemplo que vc apresentou foi muito bom também, é o primeiro que vejo utilizar em exemplo real. Gostaria se possível me dar uma luz, comecei a pouco tempo com o C# e estou com um problema de performance em uma aplicação minha e estou estudando várias possibilidades, lembrei que tinha o thread, e ai vi que nas versões mais recentes o task veio para melhorar, e agora na sua aula conheci o paralelismo e acho que agora seria o melhor para mim, más o meu caso é o seguinte. Tenho uma aplicação que preciso abrir 10 planilhas ( no total de 54 milhões de registros ), pegar os dados linha a linha e verificar se a empresa esta cadastrada ou não e se precisa de atualização, só que esse processo que já esta rodando, demora cerca de 11 a 12 dias e roda com o banco mysql. Minha idéia inicial seria criar 3 variáveis lists, contendo o caminho para as planilhas e rodar elas em 3 tasks, más nesse caso da aula, será que eu poderia criar uma função para cada planilha ( onde vai abrir a planilha e ler linha a linha ) e mandar rodar as funções dentro do parallel.foreach ? Será que eu poderia ter algum problema quando 2 ou mais informações forem jogadas para o módulo cadastroempresa ao mesmo tempo?
Estava assistindo novamente o vídeo para poder montar o meu esquema, e me veio outra perguntar quanto ao que vc falou no vídeo a partir do 34:10 sobre as informações tem que ser processadas antes e depois poder colocar no processo paralelo, nesse módulo que quero montar as planilhas de leitura são enormes e cada variável sua do ceps[], iria corresponder a uma função minha direcionada para cada planilha ( que faz a abertura da planilha e irá percorrer até o final e mandando os dados para o módulo de cadastro ) , nesse caso será que iria acontecer o problema que vc comentou de perda do objeto? Pois cada objeto já esta definido, objeto 0 abre planilha e lê planilha 1, objeto 1 abre planilha e lê planilha 2 etc etc etc , e o processamento de leitura dos dados da planilha e envio dos dados ( caso necessário para o banco de dados) , esses sim estariam sendo feitos em paralelo
Olá Álvaro tudo bem ? Existem diversas formas de fazer isso, eu mesmo já utilizei várias delas, acho que o seu tempo atual de processamento está muito alto mesmo para um single thread. Quando precisamos de performance o ideal é sempre vir subindo os níveis de memória, exemplo, você está com uma planilha em um HD que é mais lerdo que uma RAM, então tente carregar esses dados na RAM para processar posteriormente, o processamento será realizado em uma região da CPU muito mais rápida então para utilizar todo o potencial do seu chip o interessante seria ter esses dados disponíveis com a mínima latência possível. Outra forma de fazer isso é utilizar as próprias ferramentas do SQL para carregar os dados em tabelas. Você pode utilizar também um sistema de árvore de seleção nessa planilha e ler uma a uma com o máximo de thread possível, porque digo isso, vamos supor que encontre a info que deseja, não precisará gastar processamento com as outras entende ?
@@CentraldotNET Primeiramente agradeço pela ajuda. No caso em questão entendi o que seria essa árvore de seleção, más o que preciso mesmo fazer é passar por todas as linhas de cada planilha, pois o que eu preciso ver é se a informação que esta na linha lida se encontra no banco de dados e ai não poderia dispensar o restante dos dados, pois tenho a necessidade de ler mesmo. using (var reader = new StreamReader(fs)) while ((line = reader.ReadLine()) != null) { LinhaLimpa = line.Replace("\";", "ƒ"); // alt 159 LinhaLimpa = LinhaLimpa.Replace("\"", "").Replace("'", " ").Replace("\\", ""); var parts = LinhaLimpa.Split('ƒ'); if (parts[19] == "SP") { Application.DoEvents(); Empresas Empr = new Empresas { CnpjBasico = parts[0], CnpjOrdem = parts[1], CnpjDv = parts[2], . . .} Empresas.GravarTratamento(Empr); Esse é o trecho que uso, eu pego a linha da planilha, faço a separação dela, porque todos os dados vem em uma única linha, verifico se a empresa é de SP e mando para a classe Empresa e mando gravar, nessa gravação eu verifico se já existe ou não e é ai que vejo se precisa incluir ou alterar. Por isso que fiquei na dúvida se eu poderia perder o objeto, quanto vc deu o alerta no final do vídeo. Eu ainda não sei como subir todos os dados da planilha para a memória, eu cheguei a tentar fazer algo assim, e travou, pois a planilha é muito grande mesmo, tem cerca de 5 milhões de empresas cada planilha, o tamanho em disco da mais de 1gb cada planilha
Show
Ótima aula! Além disso, apresentou um exemplo de programação do mundo real, coisa que muitos canais nao fazem, ficando so nos exemplos básicos.
Show de aula, ótima didática, clareza e objetividade .
Excelente conteúdo 👏🏽👏🏽👏🏽👏🏽
Aula, fantástica.
Nossa, que aula ein, parabéns!!!!! Continue Assim!
Muito top sua abordagem. Precisamos sair do básico mesmo e não há muitos vídeos avançados no youtube. Inscrito. Sugestão de vídeos que não encontrei no canal: Generics, Reflection e tbm seria top um vídeo sobre rotinas executadas em paralelo pelo Hangfire ou outra biblioteca. Valeuu
Rapaz o próximo vídeo é justamente sobre Reflection, vou soltar entre dia 7 ou 8 de março, grande abraço
Massa!
Excelente
Muito obrigado pela aula
sensacional seu conteúdo meu querido, parabéns!!
+1 inscrito
Uma das melhores aulas, top d++++, só fiquei com a dúvida de como descubro quantos nucleos lógicos temos no meu serviço como disponivel, mas isso vou de pesquisa agora.
E ae tudo bem ? Você descobre isso a partir das especificações do seu processador, no meu caso é um Ryzen 7 8 núcleos e 16 threads, o número de threads que vale para definir o limite máximo de processadores, como no exemplo você pode limitar essa quantia configurando a instância antes de usá-la.
Muito bom o conteúdo, obrigado.
Conteúdo muito top, me ajudou muito!
Eu gostei muito do vídeo eu só tenho uma dúvida se eu tenho um sistema com alta volumetria onde vou precisar cadastrar milhoes de registros. Nesses casos o mais recomendado seria usar o paralelismo ?
Olá tudo bem ? Essa abordagem de paralelismo é interessante mas sempre deve ser as últimas opções devido a complexidade de compreender e organizar as estruturas, mas sim pode ser uma aliada se bem implementada. Qualquer dúvida estou a disposição.abracos
Primeiramente parabéns pela aula e ganhou mais 1 like e mais 1 inscrito.
O exemplo que vc apresentou foi muito bom também, é o primeiro que vejo utilizar em exemplo real.
Gostaria se possível me dar uma luz, comecei a pouco tempo com o C# e estou com um problema de performance em uma aplicação minha e estou estudando várias possibilidades, lembrei que tinha o thread, e ai vi que nas versões mais recentes o task veio para melhorar, e agora na sua aula conheci o paralelismo e acho que agora seria o melhor para mim, más o meu caso é o seguinte.
Tenho uma aplicação que preciso abrir 10 planilhas ( no total de 54 milhões de registros ), pegar os dados linha a linha e verificar se a empresa esta cadastrada ou não e se precisa de atualização, só que esse processo que já esta rodando, demora cerca de 11 a 12 dias e roda com o banco mysql.
Minha idéia inicial seria criar 3 variáveis lists, contendo o caminho para as planilhas e rodar elas em 3 tasks, más nesse caso da aula, será que eu poderia criar uma função para cada planilha ( onde vai abrir a planilha e ler linha a linha ) e mandar rodar as funções dentro do parallel.foreach ?
Será que eu poderia ter algum problema quando 2 ou mais informações forem jogadas para o módulo cadastroempresa ao mesmo tempo?
Estava assistindo novamente o vídeo para poder montar o meu esquema, e me veio outra perguntar quanto ao que vc falou no vídeo a partir do 34:10 sobre as informações tem que ser processadas antes e depois poder colocar no processo paralelo, nesse módulo que quero montar as planilhas de leitura são enormes e cada variável sua do ceps[], iria corresponder a uma função minha direcionada para cada planilha ( que faz a abertura da planilha e irá percorrer até o final e mandando os dados para o módulo de cadastro ) , nesse caso será que iria acontecer o problema que vc comentou de perda do objeto?
Pois cada objeto já esta definido, objeto 0 abre planilha e lê planilha 1, objeto 1 abre planilha e lê planilha 2 etc etc etc , e o processamento de leitura dos dados da planilha e envio dos dados ( caso necessário para o banco de dados) , esses sim estariam sendo feitos em paralelo
Olá Álvaro tudo bem ? Existem diversas formas de fazer isso, eu mesmo já utilizei várias delas, acho que o seu tempo atual de processamento está muito alto mesmo para um single thread. Quando precisamos de performance o ideal é sempre vir subindo os níveis de memória, exemplo, você está com uma planilha em um HD que é mais lerdo que uma RAM, então tente carregar esses dados na RAM para processar posteriormente, o processamento será realizado em uma região da CPU muito mais rápida então para utilizar todo o potencial do seu chip o interessante seria ter esses dados disponíveis com a mínima latência possível. Outra forma de fazer isso é utilizar as próprias ferramentas do SQL para carregar os dados em tabelas. Você pode utilizar também um sistema de árvore de seleção nessa planilha e ler uma a uma com o máximo de thread possível, porque digo isso, vamos supor que encontre a info que deseja, não precisará gastar processamento com as outras entende ?
@@CentraldotNET Primeiramente agradeço pela ajuda.
No caso em questão entendi o que seria essa árvore de seleção, más o que preciso mesmo fazer é passar por todas as linhas de cada planilha, pois o que eu preciso ver é se a informação que esta na linha lida se encontra no banco de dados e ai não poderia dispensar o restante dos dados, pois tenho a necessidade de ler mesmo.
using (var reader = new StreamReader(fs))
while ((line = reader.ReadLine()) != null)
{
LinhaLimpa = line.Replace("\";", "ƒ"); // alt 159
LinhaLimpa = LinhaLimpa.Replace("\"", "").Replace("'", " ").Replace("\\", "");
var parts = LinhaLimpa.Split('ƒ');
if (parts[19] == "SP")
{
Application.DoEvents();
Empresas Empr = new Empresas
{
CnpjBasico = parts[0],
CnpjOrdem = parts[1],
CnpjDv = parts[2],
.
.
.}
Empresas.GravarTratamento(Empr);
Esse é o trecho que uso, eu pego a linha da planilha, faço a separação dela, porque todos os dados vem em uma única linha, verifico se a empresa é de SP e mando para a classe Empresa e mando gravar, nessa gravação eu verifico se já existe ou não e é ai que vejo se precisa incluir ou alterar.
Por isso que fiquei na dúvida se eu poderia perder o objeto, quanto vc deu o alerta no final do vídeo.
Eu ainda não sei como subir todos os dados da planilha para a memória, eu cheguei a tentar fazer algo assim, e travou, pois a planilha é muito grande mesmo, tem cerca de 5 milhões de empresas cada planilha, o tamanho em disco da mais de 1gb cada planilha
@@alvarobernardi1 Mande um email com mais detalhes, posso te ajudar.
ótimo aula. Uma duvida, caso setar algum valor MaxDegreeOfParallelism e não tiver nucleos disponiveis, o que ocorre neste caso?
Esse é um valor para limite, se você colocar um valor acima do disponível na máquina ele irá usar o máximo disponível