Execution multi CPU ?

Fermé
InfoGene Messages postés 5 Date d'inscription jeudi 3 mars 2011 Statut Membre Dernière intervention 10 décembre 2013 - 4 déc. 2013 à 06:08
InfoGene Messages postés 5 Date d'inscription jeudi 3 mars 2011 Statut Membre Dernière intervention 10 décembre 2013 - 10 déc. 2013 à 01:27
Bonjour,

Quelle est la meilleur solution pour exécuter ce code Perl en temps minimum ?
J'ai un mac 10.6 avec 4 G de RAM
Dans les autres forums on parle de multi-threading, est-ce vraiment plus rapide ?

Le hash que je vais remplir dépasse le 50 millions d'entrées


!usr/bin/perl

use warnings;
use strict;
use threads;
open(R1 ,"<$ARGV[0]") || die " problem in oppening $ARGV[0]: $!\n";
my %dict1 : shared;
my $i=0;
while (my $l = <R1>){
chomp($l);
$l=~ s/\s$//;
$l=~ s/^\s//;
if ($l=~ /(.*)\s(.*)/){
$i++;
#print $1,"\n";
#my $t = threads->create($dict1{$1}++);
$dict1{$1}++;
}
}
print $i, "\n";
close R1;
A voir également:

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 déc. 2013 à 12:37
Salut InfoGene,

threads->create
prend en argument une référence à une fonction.

Si tu veux utiliser les threads, il te faudra répartir la charge envoyée sur chaque thread intelligemment.

Diviser ton fichier en morceaux envoyés à chaque thread, avec une fonction appliquant à chaque bloc tous les traitements que tu veux faire est une approche. Puis tu fais un
join
sur chaque thread créé pour t'assurer de la fin du traitement avant d'exécuter la suite de ton code.

Cependant, tu devras décider de combien de threads tu vas créer. Cela ne sert à rien d'en créer des millions comme le suggère ton code commenté. Vois avec 2 si cela améliore les performances, double pour voir...

Le gain en performances dépend de nombreux facteurs ou goulots d'étranglement : accès au disque, mémoire, et pas seulement de la puissance de calcul.

Donc il faudra tester.

Tu peux aussi optimiser ton code. La regexp
/(.*)\s(.*)/
ne fait rien d'autre que
/\s/
en réalité (vérifier s'il y a un espace n'importe où), et cela t'évite d'intégrer deux parenthèses capturantes dont tu n'as, en fait, pas besoin.

On pourrait aussi essayer de se passer des deux précédentes regexp, qui, en fait, se contentent de supprimer un espace en début et en fin de ligne s'ils existent, en passant par autre chose qu'une regexp. Mais ce n'est pas sûr qu'on gagne vraiment en temps d'exécution, les regexp Perl étant très optimisées.


Dal
0
InfoGene Messages postés 5 Date d'inscription jeudi 3 mars 2011 Statut Membre Dernière intervention 10 décembre 2013
10 déc. 2013 à 01:27
merci bien pour votre patiente de prendre le temps pour me répondre avec des explications. Je vais essayer vos suggestions et je vous tiens au courant du fonctionnement du code une fois modifié.
0