Bonjour,
Je suis débutant en Perl et je dois faire un script Perl pour demain :-(
Le principe est assez simple : je lis un fichier, j'en extrais des lignes
suivant un critère.
Le fichier est composée d'enregistrement et chaque enregistrement de 3
valeurs séparées par le caractère ";"
Exemple :
Pour un fichier de cette taille, si tu es sur un système Posix, la commande sort(1) me parait effectivement mieux adapté. Tu peux faire un trie selon plusieurs champs (regarde les options -t et -k).
Bob wrote:
Malheureusement je suis sous Windows.
Bonsoir,
Il existe un port de sort pour windows (cf. http://gnuwin32.sourceforge.net/packages/coreutils.htm) toutefois méfiez vous de l'homonyme de chez Microsoft qui réside dans %WINDIR%system32 (sous xp), je vous conseille de renommer la version GNU en usort.exe par exemple.
-- Régis Caspar
Benoit Izac wrote:
Pour un fichier de cette taille, si tu es sur un système Posix, la
commande sort(1) me parait effectivement mieux adapté. Tu peux faire
un trie selon plusieurs champs (regarde les options -t et -k).
Bob wrote:
Malheureusement je suis sous Windows.
Bonsoir,
Il existe un port de sort pour windows (cf.
http://gnuwin32.sourceforge.net/packages/coreutils.htm) toutefois méfiez
vous de l'homonyme de chez Microsoft qui réside dans %WINDIR%system32
(sous xp), je vous conseille de renommer la version GNU en usort.exe par
exemple.
Pour un fichier de cette taille, si tu es sur un système Posix, la commande sort(1) me parait effectivement mieux adapté. Tu peux faire un trie selon plusieurs champs (regarde les options -t et -k).
Bob wrote:
Malheureusement je suis sous Windows.
Bonsoir,
Il existe un port de sort pour windows (cf. http://gnuwin32.sourceforge.net/packages/coreutils.htm) toutefois méfiez vous de l'homonyme de chez Microsoft qui réside dans %WINDIR%system32 (sous xp), je vous conseille de renommer la version GNU en usort.exe par exemple.
-- Régis Caspar
Benoit Izac
Dans le message ,
Pour un fichier de cette taille, si tu es sur un système Posix, la commande sort(1) me parait effectivement mieux adapté. Tu peux faire un trie selon plusieurs champs (regarde les options -t et -k).
Sinon, il y a toujours moyen de le faire en Perl mais ça te coûtera plus cher en : - temps d'écriture du programme - temps d'execution - mémoire vive ou espace disque
D'ailleurs, il serait intéressant d'essayer File::Sort <http://search.cpan.org/~cnandor/File-Sort/Sort.pm> sur un fichier de cette taille.
J'ai fait un petit test pour voir. 'input_file' est un fichier avec 3 champs de 10 caractères, il comporte 20 000 000 lignes (648 Mo).
programme Perl utilisé : #!/usr/bin/perl use File::Sort qw(sort_file); sort_file({ I => 'input_file', o => '/dev/null', y => '400000', t => ';', k => [2, 1, 3]}); __END__
% time perl sort.pl 10294.98s user 21.63s system 98% cpu 2:54:12.44 total % time sort -t';' -k2 -k1 -k3 input_file >/dev/null 75.36s user 4.53s system 54% cpu 2:26.45 total
Y'a pas photo : 2 minutes et demi pour la version système, pratiquement 3 heures pour la version Perl.
À noter aussi qu'il manque une option « T » à File::Sort, ce qui m'a obligé à bricoler (mon /tmp fait 512 Mo).
-- Benoit Izac
Dans le message <86u0h08xnf@message.id>,
Pour un fichier de cette taille, si tu es sur un système Posix, la
commande sort(1) me parait effectivement mieux adapté. Tu peux faire
un trie selon plusieurs champs (regarde les options -t et -k).
Sinon, il y a toujours moyen de le faire en Perl mais ça te coûtera
plus cher en :
- temps d'écriture du programme
- temps d'execution
- mémoire vive ou espace disque
D'ailleurs, il serait intéressant d'essayer File::Sort
<http://search.cpan.org/~cnandor/File-Sort/Sort.pm> sur un fichier de
cette taille.
J'ai fait un petit test pour voir. 'input_file' est un fichier avec 3
champs de 10 caractères, il comporte 20 000 000 lignes (648 Mo).
programme Perl utilisé :
#!/usr/bin/perl
use File::Sort qw(sort_file);
sort_file({
I => 'input_file',
o => '/dev/null',
y => '400000',
t => ';',
k => [2, 1, 3]});
__END__
% time perl sort.pl
10294.98s user 21.63s system 98% cpu 2:54:12.44 total
% time sort -t';' -k2 -k1 -k3 input_file >/dev/null
75.36s user 4.53s system 54% cpu 2:26.45 total
Y'a pas photo : 2 minutes et demi pour la version système, pratiquement
3 heures pour la version Perl.
À noter aussi qu'il manque une option « T » à File::Sort, ce qui m'a
obligé à bricoler (mon /tmp fait 512 Mo).
Pour un fichier de cette taille, si tu es sur un système Posix, la commande sort(1) me parait effectivement mieux adapté. Tu peux faire un trie selon plusieurs champs (regarde les options -t et -k).
Sinon, il y a toujours moyen de le faire en Perl mais ça te coûtera plus cher en : - temps d'écriture du programme - temps d'execution - mémoire vive ou espace disque
D'ailleurs, il serait intéressant d'essayer File::Sort <http://search.cpan.org/~cnandor/File-Sort/Sort.pm> sur un fichier de cette taille.
J'ai fait un petit test pour voir. 'input_file' est un fichier avec 3 champs de 10 caractères, il comporte 20 000 000 lignes (648 Mo).
programme Perl utilisé : #!/usr/bin/perl use File::Sort qw(sort_file); sort_file({ I => 'input_file', o => '/dev/null', y => '400000', t => ';', k => [2, 1, 3]}); __END__
% time perl sort.pl 10294.98s user 21.63s system 98% cpu 2:54:12.44 total % time sort -t';' -k2 -k1 -k3 input_file >/dev/null 75.36s user 4.53s system 54% cpu 2:26.45 total
Y'a pas photo : 2 minutes et demi pour la version système, pratiquement 3 heures pour la version Perl.
À noter aussi qu'il manque une option « T » à File::Sort, ce qui m'a obligé à bricoler (mon /tmp fait 512 Mo).