shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problemas com performance de script shell


From: mrgraucio
Subject: Re: Problemas com performance de script shell
Date: Mon, 14 Nov 2011 23:58:40 -0000
User-agent: eGroups-EW/0.82

MrBits e Rodrigo,

MUITO OBRIGADO!

Não sou expert no assunto apesar de mexer com shell há algum tempo, é sempre 
bom ver as técnicas pra não envolver sub-shells e ganhar mais tempo. 
Particularmente prefiro reduzir ao máximo os processos filhos, porém nem sempre 
tenho conhecimentos suficientes para tal. Essas dicas foram extremamente 
esclarecedoras e também me abriram a cabeça pra novos scripts.

Valeu MESMO!!!

Abraços!!!

--- Em address@hidden, Rodrigo Boechat <rodrigo.boechat.tenorio@...> escreveu
>
> Até onde compreendi, eu faria as seguintes alterações:
> Na linha:
> grep -B 1 '^3' "/home/$USER/teste" | sed 's/ //g' | sed '/--/d' | sed -e 
> "N;s/\n$3/3/g"
> 
> Eu faria:
> grep -B 1 '^3' "/home/$USER/teste" | sed -e "s/ //g" -e "/--/d" -e 
> "N;s/\n$3/3/g"
> 
> Evita muitos Pipes e dará no mesmo resultado.
> 
> OBS: Eu uso o Bash. As partes que você chama as subshell's não 
> funcionaram aqui pelo fato da variável $a não estar definida na 
> subshell. Isso foi tranquilo de contornar.
> 
> Justamente falando de subshell's, vi que você executa uma quantidade 
> enorme de subshell's com esse laço for.
> Por exemplo:
> O que você faz com uma subshell nessa linha:
> var1=$(cut -c2-10 <<<$a)
> 
> Você poderia fazer:
> var1=${a:1:9}
> 
> Assim, evitaria uma subshell.
> O mesmo pode ser feito para a var2, var3, ... varN.
> 
> Bom. Sinceramente eu não entendi o que você quis fazer com essa linha:
> if [ $(cut -c26-31) -eq 109 ]; then
> 
> E também, de acordo com o exemplo que você me deu, a parte:
> sed '/--/d'
> 
> Esculhambou a saída do comando completo quando eu inseri "--" em 
> qualquer linha.
> Coloque em qualquer linha o "--" no exemplo que você passou e execute o 
> comando:
> grep -B 1 '^3' "/home/$USER/teste" | sed 's/ //g' | sed '/--/d' | sed -e 
> "N;s/\n$3/3/g"
> 
> Acho que o resultado não é o esperado.
> 
> Trocando o sed '/--/d' de posição, para depois do sed -e "N;s/\n$3/3/g" 
> o problema foi evitado.
> Imaginando que você não queira trabalhar com linhas que possuam o "--"...
> 
> Espero ter ajudado.
> :)
> 
> Rodrigo Boechat
> 
> 
> Em 14-11-2011 20:24, mrgraucio escreveu:
> >
> > Opa Rodrigo, valeu!
> >
> > 2001201110313947J555555400362682011103115254000000000000051014000100010100100000
> > 300198513700000510140000001425096004889043517
> > 2001201110313947J555555600402682011103115324200000000000017569000100010100100000
> > 334196513700000175691092251759522938018963000
> > 2001201110313947J545555200432682011103115345600000000000020222000100010100100000
> > 334193513700000202221092251759452938018963000
> > 2001201110313947J555555500412682011103115332000000000000022981000100010100100000
> > 334191513700000229811092251759782938018963000
> > 2001201110313947J554565500422682011103115340200000000000015210000100010100100000
> > 334199513700000152101092251759602938018963000
> >
> > --- Em address@hidden 
> > <mailto:shell-script%40yahoogrupos.com.br>, Rodrigo Boechat 
> > <rodrigo.boechat.tenorio@> escreveu
> > >
> > > Por favor, mande um exemplo com valores fictícios do arquivo de entrada.
> > > Três conjuntos de linhas "2" e "3" seria suficiente.
> > >
> > > Rodrigo Boechat
> > >
> > > Em 14-11-2011 19:42, mrgraucio escreveu:
> > > >
> > > > Boa noite galera!
> > > >
> > > > Estou com um problema na leitura de arquivos, classificação desses
> > > > dados e armazenamento em banco de dados. Tenho um arquivo que tem em
> > > > torno de 4 mb com informações sobre a produção de uma determinada
> > > > empresa. Nele tenho linhas que iniciam com o número 2 e 
> > complementadas
> > > > com linhas iniciadas pelo número 3. Basicamente transformo as linhas
> > > > iniciadas por 2 e 3 em uma só. A linha iniciada por 2 tem sempre 80
> > > > caracteres, a iniciada por 3 varia de acordo com o tipo do produto em
> > > > questão. Faço a separação por serviços de acordo com o número de
> > > > caracteres da linha. Ex.:
> > > >
> > > > for a in $(grep -B 1 '^3' $ARQ | sed 's/ //g' | sed '/--/d' | sed -e
> > > > "N;s/\n$3/3/g"); do /* FAÇO A LINHA COMPLEMENTAR, DE INICIO 3, VOLTAR
> > > > UMA LINHA ACIMA, AO FINAL DA LINHA DE INÍCIO 2. ESSE CARA DEMORA BEM
> > > > POUCO */
> > > >
> > > > if [ $(wc -c <<<$a) -eq <num de caracteres> ]; then /* CLASSIFICAÇÃO
> > > > DE ACORDO COM NUMERO DE CARACTERES */
> > > >
> > > > if [ $(cut -c26-31) -eq 109 ]; then /* ESSES CARACTERES ME DÃO O
> > > > CÓDIGO DO PRODUTO, CASO ALGUMA LINHA TENHA O MESMO NÚMERO DE
> > > > CARACTERES MAS NÃO SEJA O MESMO PRODUTO */
> > > > var1=$(cut -c2-10 <<<$a)
> > > > var2=$(cut -c11-15 <<<$a)
> > > > varn=$(cut -cnn-nn <<<$a)
> > > > fi
> > > >
> > > > fi
> > > >
> > > > done
> > > >
> > > > Porém está demorando em torno de 25 minutos para terminar a
> > > > classificação dos dados.
> > > >
> > > > Há alguma forma de eu conseguir executar vários loops de uma só vez,
> > > > fazendo algum fork ou algo do gênero? Procurei em vários lugares
> > > > também a respeito de como fazer multi-processamento dessas tarefas
> > > > para melhorar a distribuição das tarefas entre threads do CPU
> > > > (Core2Quad) mas também cheguei no fim da linha e não consegui nada!
> > > >
> > > > O arquivo é executado a partir de uma tmpfs, acreditei ser melhor 
> > para
> > > > ter maior velocidade de leitura.
> > > >
> > > > Alguém tem uma luz de como deixar este processo mais rápido?
> > > >
> > > > Grato e muito obrigado!
> > > >
> > > >
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> >
> > 
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]