Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Tenho uma dúvida com relação à execução de um script que tenho em meu projeto. Sei que muitos amigos aqui possuem anos de experiência, por isso posto essa pergunta. Nunca peguei um projeto grande para fazer, e por isso, simples laços com dados do MySQL eram suficientes, porém agora tenho uma quantidade MUITO grande de dados para tratar e todos eles precisam executar de tempos em tempos o mais rápido possível.
Dúvida - Tenho um algoritmo que faz a seguinte tarefa:
Isso tudo é bem demorado, faço muito curl e interações, o script é lento para uma única consulta imagina para milhares! Alguém já passou por algo semelhante e sabe como otimizar esse processo, não usar um algoritmo linear como o meu, mas turbinar de alguma forma (que não conheço ainda) a resolução do problema?
O que você passou é muito vago. Seria melhor com exemplos. Abaixo, o que eu faria com base no que você falou.
Exemplos são inúteis nessa situação pois é basicamente o que eu falei. Meu problema é meio o Massaki falou, faço isso tudo de uma única vez. Acho que a melhor maneira é separar tudo e ir por etapas.
Hufersil eu tiro um hash de TODO o XML, pois se mudar alguma coisa vou saber, o md5 muda sempre e me ajuda a aber se mudou algum status.
Uma vez estava estudando uns vídeos da Harvard University que eles falavam sobre esses algorítimos pois eles são ineficientes.
Entendo.
Hoje trabalhamos com alguns clientes aqui na empresa, onde a base de dados tem milhões registros, e recebemos diariamente um arquivo com média de 8mb de TEXTO para atualizar. Neste processo, em suma:
- se há novos itens a serem inclusos;
- se há itens a serem atualizados;
- se há itens a serem desprezados;
- se há embalagens a serem inclusas;
- se há embalagens a serem atualizadas;
- disparo de e-mails aos responsáveis dos setores para informar sobre a importação dos dados;
Isto porque, em cada arquivo, eles mandam informações relacionadas a hoje + 5 dias a frente.
Amanhã, eles mandam o de amanhã e mais 5 dias na frente. Assim, tenho 4 dias que podem se repetir, onde eles poderão sofrer alterações (por exemplo, um item que era para ser processado conforme arquivo de ontem, o de hoje já fala que não precisa mais).
Esta consulta de atualização/desprezo de itens, é feita em cima desta tabela que contém os já cadastrados milhões de registros.
Uma das coisas que fazemos, para minimizar o impacto, é separar o arquivo de 8mb, e quebrar em vários arquivos menores (aproximadamente 50kb cada um) e processa-los separadamente. Assim, também é possível criar vários processos simultâneos.
Outra otimização, foi feita na parte de scripts.
Por exemplo, ao invés de fazer isto:
$item = array_shift($itens);
fazemos isto
$item = $itens[$i]; // var $i aponta para o indice atual sendo tratado
Só nesta otimização de leitura, tiramos 60% de lentidão.
Os e-mails, são disparados em processos separados.
Eles são armazenados em tabelas de envio de e-mail (da mesma forma que lhe sugeri) e enviados posteriormente, por outro servidor.
Realmente, a máxima "dividir para conquistar" é válida.
Quebrar o seu processo em vários processos menores lhe trará um bom ganho em performance e evitará gargalos no seu servidor.
Espero que estas experiências relatadas acima lhe auxiliem na tomada de decisões.
Um forte @braço!
Vou fazer o que você falou Hugo, e usar o iron.io para envio de e-mail. Também quem sabe usar um pouco do IronWorker e tirar um pouco disso do meu servidor, também to querendo criar uma tabela na memória do MySQL com os dados a serem processados, assim o acesso vai ser rápido.
Você faz tudo isso de uma vez?
Eu sugiro que marque o tempo gasto em cada etapa (curl, comparação do hash, envio do email), para entender onde está o problema para aí sim pensar na solução.