[SP-pm] ordenando arquivos.

Thiago Yukio Kikuchi Oliveira stratust at gmail.com
Tue Jul 26 11:41:21 PDT 2011


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 em 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 em 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 em 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 em lgmb.fmrp.usp.br
  /=)            stratust em 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 em 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 em pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110726/032563f1/attachment.html>


More information about the SaoPaulo-pm mailing list