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: Julio C. Neves
Subject: Re: [shell-script] Re: Problemas com performance de script shell
Date: Thu, 17 Nov 2011 09:22:45 -0200

É... Nesse caso vc teria de meter um sed para tirar essas duplicidades e só
então aplicar o xargs, mas aí não creio que compense. Se a sua massa de
dados for muito grande, acho que vale a pena fazer um teste.

Já que vc perguntou, por coincidência, no dia 05/12 estarei começando um
curso de Shell na SoftSell de
Curitiba<http://www.softsell.com.br/treinamento/detalhes.php?tid=323>(após
o curso vou pedir para trocar o nome para SoftShell ;). Até a semana
passada ainda tinham 2 vagas.

Abcs,
Julio
*Quer aprender tudo de Shell em 2 fins de semana?*
*  address@hidden <address@hidden> ou  (21) 8112-9988*
**
*** » **julioneves1      » juliobash*



Em 17 de novembro de 2011 00:04, mrgraucio
<address@hidden>escreveu:

> **
>
>
> hehehe não sou o melhor conhecedor de Floripa, isso ficou claro né? haha
>
> Pois é, achei muito bacana o uso do xargs, porém não são todas as linhas
> que começam com 2 que são seguidas por uma de início 3, as vezes tenho
> linhas de início 2 e outra em seguida com início 2 também, essas não vamos
> usar, aí inviabiliza o uso do xargs...
>
> Aproveitando, tem alguma previsão de curso de shell mais avançado aqui
> pelo Paraná ou em Santa Catarina mesmo Julio? Estou estudando C no momento,
> mas gostaria de me aprofundar mais ainda no shell já que ele é filhote do C.
>
> De qualquer forma muito obrigado e grande abraço!
>
> --- Em address@hidden, "Julio C. Neves" <julio.neves@...>
> escreveu
> >
> > Fala Perdido! ;)
> > eu não li toda a thread (falta de tempo) mas eu tentaria substituir este
> > for por um xargs. Veja como:
> >
> > $ cat arq
> > 2linha 1
> > 3linha 2
> > 2linha 3
> > 3linha 4
> > 2linha 5
> > 3linha 6
> > 2linha 7
> > 3linha 8
> > 2linha 9
> > 3linha 10
> > $ cat arq | xargs -L2
> > 2linha 1 3linha 2
> > 2linha 3 3linha 4
> > 2linha 5 3linha 6
> > 2linha 7 3linha 8
> > 2linha 9 3linha 10
> >
> > Repare que desta forma já coloquei os registros tipo 3 depois dos tipo 2
> e
> > ignorei os brancos. Isso deve ser bem mais rápido que o for.
> >
> > Abcs,
> > Julio
> > *Quer aprender tudo de Shell em 2 fins de semana?*
> > * julio.neves@... <julio.neves@...> ou (21) 8112-9988*
> > **
> > *** » **julioneves1 » juliobash*
> >
> >
> >
> > Em 16 de novembro de 2011 17:36, mrgraucio
> > <escrevenaconcha@...>escreveu:
> >
> > > **
> > >
> > >
> > > Grande Julio!
> > >
> > > Tive aulas contigo em Florianópolis na Seven Treinamentos, março de
> 2010.
> > > Não sei se vc lembra que eu fui te levar até o trabalho no último dia
> de
> > > aula e me perdi mais que cueca em bunda de gordo!? Saudações!
> > >
> > > Então, eu acabei entrando aqui pra deixar a resposta de como resolvi,
> > > tentei trocar o $IFS mas acabei achando uma solução que gostaria do seu
> > > parecer.
> > >
> > > Aqui:
> > >
> > > for a in $(grep -B 1 'ˆ3' $ARQ | sed 's/ *$//g' | sed '/--/d' | sed -e
> > > "N;s/\n$3/3/g"); do
> > >
> > > Acabei fazendo uma troca de espaço por ';' e depois quando vou fazer a
> > > separação de campos eu substituo o ';' por espaço assim:
> > >
> > > ${a//;/ }
> > >
> > > Meio assustador mas deu certo! O que acha?
> > >
> > > Grande abraço!
> > >
> > > --- Em address@hidden, "Julio C. Neves" <julio.neves@
> >
> > > escreveu
> > > >
> > > > Para acelerar um pouco mais e respondendo na mesma linha do MrBiTs,
> > > troque:
> > > >
> > > > $(wc -c <<<$a)
> > > >
> > > > por:
> > > >
> > > > ${#a}
> > > >
> > > > Para evitar problemas com espaço, antes do for, atribua ao IFS um
> > > caractere
> > > > que não esteja presente no arquivo. P.ex.
> > > >
> > > > IFS=^
> > > >
> > > > Abcs,
> > > > Julio
> > > > *Quer aprender tudo de Shell em 2 fins de semana?*
> > > > * julio.neves@ <julio.neves@> ou (21) 8112-9988*
> > > > **
> > > > *** » **julioneves1 » juliobash*
> > > >
> > > >
> > > >
> > > > Em 16 de novembro de 2011 16:56, mrgraucio
> > > > <escrevenaconcha@>escreveu:
> > > >
> > > > > **
> > > > >
> > > > >
> > > > > Pois é, está quase lá, porém enfrento mais um problema...
> > > > >
> > > > > Há algumas linhas do arquivo que vêm com espaços, como por exemplo
> > > linhas
> > > > > contendo nomes e cpf. Quando rodo o loop para unir as linhas
> ˆ2 com
> > > ˆ3
> > > > > essas linhas são quebradas no espaço!
> > > > >
> > > > > Tentei: for a in "$(grep -B 1 'ˆ3'...)" e não quebra mais nos
> > > espaços, mas
> > > > > também tudo vira uma linha só. Nesse caso, qual valor devo
> atribuir ao
> > > $IFS
> > > > > ou há alguma maneira mais legal e rápida de solucionar esse
> problema de
> > > > > quebra de linha?
> > > > >
> > > > > Abraço!
> > > > >
> > > > >
> > > > > --- Em address@hidden, Rodrigo Boechat
> > > > > <rodrigo.boechat.tenorio@> escreveu
> > > > > >
> > > > > > 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]
> > > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > > > [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]