[Cascavel-pm] geração de arquivos

Daniel Ruoso daniel em ruoso.com
Segunda Dezembro 29 11:32:22 PST 2008


Em Seg, 2008-12-29 às 17:13 -0200, Elvio Barbalho escreveu:
> senhores boa tarde, tenho vários arquivos em vários diretórios, tenho
> que concatenar todos em um só gerando um trailler com a soma de todas
> as linhas mais um somatório de um campo de cada linha do arquivo. Até
> ai nenhum problema leio um arquivo por vez e vou realizando os
> procedimentos que tenho que fazer sem problemas. O problema e que a
> quantidade e tamanho dos arquivos estão ficando cada vez maior e o
> processo esta demorando muito, pensei em utilizar thread entretanto
> estou utilizando a versão 5.10 e na documentação diz In Perl 5.10,
> the 5005threads model was removed from the Perl interpreter.

A resposta rápida é: não use threads.

A resposta longa é:

Na verdade o modelo perl5005threads foi abolido, tem um novo módulo que
suporta threads sem problemas, mas realmente, não é threads o que você
quer. [ perldoc threads ]

Você tem duas opções para resolver o seu problema de uma maneira
simples.

A primeira é usando fork e pipe, você cria vários processos filhos manda
cada um ir lendo um arquivo e escreve para o pipe com o processo pai,
que vai então somando tudo. [ perldoc -f fork, perldoc -f pipe ]

A segunda é usando IO assíncrono, o segredo é: ao invés de esperar
bloqueado enquanto o IO acontece, você já vai enfileirando operações com
outros arquivos, e processando a informação na medida em que o sistema
operacional te entrega os dados. Esse é o mais elegante, mas o código
fica um pouco mais "avançado", porque a pessoa tem que saber o que é IO
assíncrono. [ perldoc IO::Handle, perldoc IO::Select, uma mensagem que
eu postei a pouco tempo usando esses dois módulos ]

Por fim, uma observação: se todos os arquivos estão vindo do mesmo
lugar, a chance é que ler mais de um ao mesmo tempo irá só atrasar ainda
mais a leitura (exceto se você tiver um RAID, que balanceia a carga de
leitura entre os discos, mas mesmo assim, só no limite de 2 ao mesmo
tempo (no caso de RAID1) e N ao mesmo tempo (N sendo o número de discos,
no caso de RAID5)).

No entanto, se os arquivos estiverem espalhados em n lugares diferentes,
vale a pena estudar para saber quantos você pode ler ao mesmo tempo (de
cada lugar) para ter ganho de performance.

Agora você entende porque que mainframes são legais...

daniel



Mais detalhes sobre a lista de discussão Cascavel-pm