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: Tue, 15 Nov 2011 19:08:10 -0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20111001 Thunderbird/7.0.1

Ok.
Fico feliz em ter participado da ajuda.
Aguardo o script pronto. Estou curioso para ver como ficou o conjunto 
completo.

:)

Em 14-11-2011 23:07, mrgraucio escreveu:
>
> 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 
> <mailto:shell-script%40yahoogrupos.com.br>, 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>
> > > <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]
> >
>
> 


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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