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

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

Re: [shell-script] Re: Problemas com performance de script shell


From: Rodrigo Boechat
Subject: Re: [shell-script] Re: Problemas com performance de script shell
Date: Mon, 14 Nov 2011 21:35:03 -0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20111001 Thunderbird/7.0.1

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]