Fazer o 'sort' de arquivos gigantes está sendo o problema da bioinformática ultimamente (cada sequencia que eu recebo é um arquivo texto com 15GB de informação cada).
Perl não dá conta de fazer o sort pois faz tudo em memória. Além disso, apesar de termos memória o suficiente (128GB) ela não é tão rápida quanto um programa em C específico para sorting. No seu caso eu recomendo usar o sort do linux. No exemplo abaixo estou usando a data de modificação para ordenar: [stratus@darkside test]$ ls -lh total 0 -rw-r--r-- 1 stratus users 0 Jul 26 12:09 a.txt -rw-r--r-- 1 stratus users 0 Aug 11 2009 b.txt -rw-r--r-- 1 stratus users 0 Dec 11 2008 c.txt -rw-r--r-- 1 stratus users 0 Dec 11 2008 d.txt [stratus@darkside test]$ ls -l --time-style=long-iso | sort -k6,6 -k7,7n total 0 -rw-r--r-- 1 stratus users 0 2008-12-11 01:00 c.txt -rw-r--r-- 1 stratus users 0 2008-12-11 01:30 d.txt -rw-r--r-- 1 stratus users 0 2009-08-11 01:00 b.txt -rw-r--r-- 1 stratus users 0 2011-07-26 12:09 a.txt Se precisar renomear o arquivo, vc pode usar perl apos o comando por exemplo: [stratus@darkside test]$ ls -l --time-style=long-iso | sort -k6,6 -k7,7n | perl -lane 'next unless $F[7]; $i++; print "$F[7] -> $i.txt" ' c.txt -> 1.txt d.txt -> 2.txt b.txt -> 3.txt a.txt -> 4.txt Obs: O sort do unix não usa memória , porem ele cria os arquivos de indexação no /tmp. Se o /tmp for uma partição menor que o arquivo que está sendo ordenado, ele vai apresentar segmentation fault. Isso já aconteceu comigo. Se for o seu caso, vc pode mudar a partição que o sort usa, mudando a variavel de ambiente antes de usar o sort: export $TMPDIR=/your/path Para arquivos de 9GB o sort deve demorar mais de meia hora. Se você for utilizar isso com frequencia, dê uma olhana no nsort ( http://www.ordinal.com/) Ele não é free, porém é muito rápido (ordena 1TB em 33 minutos) E você pode baixar uma versão de testes por 30 dias. / Thiago Yukio Kikuchi Oliveira (=\ \=) Faculdade de Medicina de Ribeirão Preto / Laboratório de Genética Molecular e Bioinformática /=) ----------------------------------------------------------------- (=/ Centro de Terapia Celular/CEPID/FAPESP - Hemocentro de Rib. Preto / Rua Tenente Catão Roxo, 2501 CEP 14151-140 (=\ Ribeirão Preto - São Paulo \=) Fone: 55 16 2101-9300 Ramal: 9603 / E-mail: [email protected] /=) [email protected] (=/ / Bioinformatic Team - BiT: http://lgmb.fmrp.usp.br (=\ Hemocentro de Ribeirão Preto: http://pegasus.fmrp.usp.br \=) / ----------------------------------------------------------------- 2011/7/26 Andre Carneiro <[email protected]> > Salve! > > Tenho que ordenar 3 milhões de arquivos de um diretório(e isso tende a > aumentar). Mesmo que eu mova parte dos arquivos para outros diretórios, > ainda assim vai sobrar arquivo pra caramba. > > Desse modo, eu pesquisei no perlmonks e outros lugares, e achei esse código > abaixo que até resolveria, se não fosse o problema de memória, pois usa uma > quantidade de memória proporcional a quantidade de arquivos. > > > <code> > > #!/usr/bin/perl > > use strict; > use warnings; > use DateTime; > > my $start_time = time; > > my %times = (); > > opendir DIR, $ARGV[0] or die "Couldn't open $ARGV[0]; $!\n"; > > my @sorted = > sort { > $times{$b} cmp $times{$a}; # Was cmp D'oh! Thanks [dws] > } > map { > $times{$_} = (stat $_)[9]; $_; > } readdir DIR; > > closedir DIR or warn "Couldn't close $ARGV[0]; $!\n"; > local $" = $/; > print "@sorted\n"; > > my $end_time = time; > > my $enlapsed_time = $end_time - $start_time; > > my $dt = DateTime->from_epoch( epoch => $enlapsed_time ); > > my $etime = $dt->hms(':'); > > print "\nCrapy time: $etime\n"; > > </code> > > Alguém conhece um algoritmo onde, sei lá, eu pudesse ordernar parte desses > arquivos e de depois juntar tudo de alguma forma, ou algo desse tipo? > > Thx! > > > -- > André Garcia Carneiro > Analista/Desenvolvedor Perl > (11)82907780 > > =begin disclaimer > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ > SaoPaulo-pm mailing list: [email protected] > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> > =end disclaimer > >
=begin disclaimer Sao Paulo Perl Mongers: http://sao-paulo.pm.org/ SaoPaulo-pm mailing list: [email protected] L<http://mail.pm.org/mailman/listinfo/saopaulo-pm> =end disclaimer
