Humm... tem certeza que não usa a memória? Provavelmente ele deve usar um merge sort para ordernar os pedacinhos juntos. Vou ler mais antes de falar alguma coisa.
De qualquer forma, valeu a dica! thiago_yukio++ # 2011/7/26 Thiago Yukio Kikuchi Oliveira <[email protected]> > 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 > > -- 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
