[SP-pm] ordenando arquivos.

Andre Carneiro andregarciacarneiro at gmail.com
Tue Jul 26 12:56:39 PDT 2011


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 <stratust at gmail.com>

> 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 at 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 at 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 at 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: stratus at lgmb.fmrp.usp.br
>   /=)            stratust at gmail.com
> (=/
>   /    Bioinformatic Team - BiT: http://lgmb.fmrp.usp.br
> (=\   Hemocentro de Ribeirão Preto: http://pegasus.fmrp.usp.br
>   \=)
>    /  -----------------------------------------------------------------
>
>
> 2011/7/26 Andre Carneiro <andregarciacarneiro at gmail.com>
>
>> 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: SaoPaulo-pm at pm.org
>>  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: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>


-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl
(11)82907780
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110726/15721c5a/attachment-0001.html>


More information about the SaoPaulo-pm mailing list