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: Tue, 15 Nov 2011 01:07:24 -0000
User-agent: eGroups-EW/0.82

Rodrigo:

Acabei esquecendo de responder alguns trechos da sua resposta!

- Na sua substituição do grep -B 1... acaba adicionando sempre uma linha em 
branco, por isso usei pipes;

- A linha "if [ $(cut -c26-31) -eq 109 ]; then" é que os caracteres da posição 
29-31 indicam o tipo do produto que a empresa 'comercializou', ou na linguagem 
deles o tipo do serviço. Fiz então "if [ ${a:28:3} -eq 109 ]; then" e deu certo.

Enfim, após unir as linhas ^2 com ^3 eram processadas em torno de 45000 linhas 
do mesmo tipo de serviço, que demorava em torno de 25 minutos, agora demora 4! 
Eu havia esquecido completamente da expansão de variáveis! Antes eu trabalhava 
com o script dividindo cada tipo de serviço em arquivos diferentes para depois 
abri-los em cada chamada por tipo de serviço no sistema, acabei usando o wc -c 
e cut -c#-# nessa primeira versão e acabei não mexendo nisso, mas sinceramente 
não lembrava desse modo proposto por você e o MrBits! 

Assim que eu terminar o script eu posto na integra aqui para apreciação, mas 
por enquanto, VALEU MESMO!!!



--- 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]