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

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

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


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

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

On 11/14/2011 07:42 PM, mrgraucio wrote:
> 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!

Você não precisa de engenharia de foguetes para resolver seus problemas. Seja 
simples.

Esses cuts estão matando a performance do seu script. É simples notar que a 
cada linha do arquivo você iniciará um subshell para
executar o cut 3 vezes. Você tem idéia do custo que isso é para a CPU ? Mesmo 
as CPUs mais rápidas de hoje ainda são limitadas por
I/O e outras nuances.

Prefira trabalhar com substrings. Talvez algo assim:

if [ ${a:25:6} -eq 109 ] ; then

Aqui pegamos a string a, do seu 26o caracter, os próximos 6, que vão chegar no 
caracter 31.

Os cut dentro do if também podem ser substituídos pelo mesmo esquema

var1=${a:1:10}

e assim por diante.

Garanto que a performance vai melhorar MUITO.

- -- 

LLAP

.0. MrBiTs - address@hidden
..0 GnuPG  - 
http://keyserver.fug.com.br:11371/pks/lookup?op=get&search=0x6EC818FC2B3CA5AB
000 http://www.mrbits.com.br


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQEcBAEBCAAGBQJOwaLtAAoJEG7IGPwrPKWrYA0IALNWLBWSbi2FXRAkV5zMcaAh
bydzS57NN1Jcl4uGmd0TH/YaV1c35Se7Fbq3lu3VA/8x6J+sAYMJlMwtyIWZlcKK
JOe2BaZs+R+lQtWhFnta/XtN4zMjGiR2rkNQ/W2IDZGXrmhT8DWxbynFRY5aTTtz
NpGcb628xR0c3US12NZJSPSZM20YA2fAF2oWy28Z/33TPDAgxg1s9nGdCCrRXKoW
6ay+EwwZnKQxBQ+gIyySlHx+cTKQKXbw2wQc8OVV/IrGhZEyvfveeif0lvY/6btI
JUFJ4hs8SjhUgFnzYpIRoY9sN3TTxIEizMTLZl0CGdGWSn5Z1jXUcoI8Fp4ELc4=
=IrYF
-----END PGP SIGNATURE-----


reply via email to

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