passage d'une hash en paramètre à une autre script

passage d'une hash en paramètre à une autre script - Perl - Programmation

Marsh Posté le 30-09-2005 à 13:03:55    

[url]Salut tout le monde!!
Je suis très enthousiaste à l'idée d'avoir...enfin...la réponse à mon problème!! :bounce:  
J'ai vu que sur ce forum y avait de la matière grise, alors je me lance!!
Voilà :
J'ai un script1.pl qui crée une hash %matrix énorme.Dans ce script, à l'aide du module threads, je crée un thread qui lance un programme script2.pl indépendant de la suite du fonctionnement de script1.pl.
Je voudrais passer %matrix (ma hash :pt1cable: ) à ce programme.
Le script1.pl se termine et le script2.pl poursuit lui son petit bonhomme de chemin en décorticant la hash transmise.
Pourriez vous m'indiquer une synthaxe précise et complète qui permettrait de résoudre ce problème?
 
Merci :sol:  
 
 
PS: on m'a parlé de référence, mais j'y comprend rien de rien!! :pfff: [/url]

Reply

Marsh Posté le 30-09-2005 à 13:03:55   

Reply

Marsh Posté le 01-10-2005 à 11:12:05    

les références c'est comme les références (ou pointeurs) en C : au lieu de passer une copie en mémoire de ton objet, tu lui passes directement l'adresse mémoire où elle se trouve, et donc tu manipules directement l'objet
 
ensuite pour ton problème, perso je ne connais pas de moyen "élégante" pour passer un hash à un autre programme perl, hormis de cracher le contenu du hash dans un fichier et passer le fichier en paramètre
généralement mon hash est encore en mémoire au moment où j'appelle une autre routine plutôt que d'appeler un autre fichier, cela m'évite de faire des choses compliqués pour le passage de paramètres
sinon je suis preneur si qqun a une solution plus élégante que le passage par fichier

Reply

Marsh Posté le 01-10-2005 à 11:13:29    

ptet qu'une serialization serait intéressante : http://search.cpan.org/~neely/Data [...] ializer.pm

Reply

Marsh Posté le 01-10-2005 à 17:17:01    

En effet pour l'instant je passe par un fichier intermédiaire mais qu'est ce que ça ralenti!!
Je vais voir ton lien merci!

Reply

Marsh Posté le 01-10-2005 à 17:19:27    

J'ai utilisé le module storable pour récupéré de façon ultra rapide ma hash malheureusement ça passe par un fichier.
(utilisation de store and retrieve)
Non, vraiment il faudrait le passage de la référence en paramètre!!
Mais je sais pas faire ça...

Reply

Marsh Posté le 01-10-2005 à 18:24:29    

bah un hash ca se passe en paramètre de fonction y'a aucun soucis
 
si tu tiens à passer par un fichier, fais plutôt un Data::Dumper
 

Reply

Marsh Posté le 02-10-2005 à 20:13:19    

Pourkoi data dumper?
storable est bcp plus efficace
Tu peux aussi passer par une variable d'envirionnement
 
genre $ENV{data_perl} = nfreeze(\%hash);

Reply

Marsh Posté le 03-10-2005 à 11:41:24    

Là pospos tu m'intéresses!!
Peux tu m'en dire plus?

Reply

Marsh Posté le 03-10-2005 à 23:24:27    

je viens de relire ta question initiale.
Pourkoi utilise tu une thread pour lancer ton second programme??
 
si tu est sous linux je te conseil plutot un fork+exec
et si tu es sous windows (et activeperl) tu peu utiliser system(1, ...)
 
en gros: system(1, "perl script2.pl" );
et il se lancera en // du script courant
 
mais tout de meme, et avant de partir dans des histoires de serialization de données, pourkoi diable a tu besoin d'un second script independant? N'y aurait il pas moyen de faire autrement? explique un peu ton systeme


Message édité par pospos le 03-10-2005 à 23:25:02
Reply

Marsh Posté le 04-10-2005 à 14:14:36    

Salut!!
C'est un système modulaire de décorticage de texte.
Si tu veux il y a beaucoup de texte : titre+texte.
Le 1er module décorike le 1er texte puis lance le 2eme module.Puis le 1er module décortik le 2eme texte pendant que le 2eme module traite le 1er texte, puis le 1er module lance un autre 2eme module (et ce independament du 1er 2eme module) traitant le 2eme texte.Le 1er module traite alors le 3eme texte, pendant que le 1er 2eme module lance un 3eme module traitant le 1er texte.le 1er 2eme module s'éteint alors que le 3eme autonome continu son chemin. En parallèle le 2eme 2eme module continue son oeuvre sur le 2eme texte...
Ainsi desuite...vois tu?

Reply

Marsh Posté le 04-10-2005 à 14:14:36   

Reply

Marsh Posté le 04-10-2005 à 14:51:53    

t'es sous windows?
et quel est l'interet de faire ca en // ?
en koi consiste ce "decorticage"?

Reply

Marsh Posté le 04-10-2005 à 15:10:16    

Je suis sous mac.
Intérêt professionnel!!Textmining.
Décorticage=extraction de caractères spéciaux, extraction de données pertinentes...

Reply

Marsh Posté le 04-10-2005 à 15:11:31    

ok, mais pourkoi le faire ne // au lieu de le faire simplement en sequentiel, texte apres texte?

Reply

Marsh Posté le 04-10-2005 à 15:59:10    

pour gagner du temps et être le plus rapide possible vu que la base texte est énorme

Reply

Marsh Posté le 04-10-2005 à 16:15:30    

et est tu certainq ue ca ira plus vite en le faisant en //?
Si c'est juste du caclul bourrin alors ca n'ira pas plus vite, ca ira meme sans doute moins vite que de le faire en sequentiel (à moins que tu ai une machine multiproc, et dans ce cas tu aurai tinteret à utiliser un process par CPU, et pas plus)
 
D'ou viennent ces textes? de fichiers? d'une base de donnée?

Reply

Marsh Posté le 04-10-2005 à 17:19:35    

Ils viennent d'une bdd.
C'est ce qui m'arrive...ça ne va pas plus vite...
Ce que tu veux dire c'est qu'un process de textmining kelkil soit utilise la totalité des capacités du proc?

Reply

Marsh Posté le 04-10-2005 à 17:58:56    

Et sinon tu pourrais mieux m expliquer comment tu ferais avec les ref?

Reply

Marsh Posté le 04-10-2005 à 18:06:03    

non
les ref n'ont d'existance qu'au sein d'un meme processus.
Si tu veux partager des valeurs entre differents processus alors tu n'a d'autre moyen que de serialiser le contenu de ta ref, l'envoyer (par fichier, socket, variable d'environnement, ou ce que tu veux) et le deserialiser de l'autre coté. C'est ni tres efficace ni tres propre...
 
Donc si tu veux absolument faire plusieurs choses à la fois tu devrait plutot tout faire avec des threads.
mais franchement je suis persuadé que tu irais plus vite en faisant ca en sequentiel (et en le faisant bien).

Reply

Marsh Posté le 04-10-2005 à 18:21:37    

ledzep2 a écrit :

Ils viennent d'une bdd.
C'est ce qui m'arrive...ça ne va pas plus vite...
Ce que tu veux dire c'est qu'un process de textmining kelkil soit utilise la totalité des capacités du proc?


 
j'avais pas vu ce msg
 
post un bout de code et on pourra peut etre t'aider à optimiser un peu ton approche

Reply

Marsh Posté le 05-10-2005 à 11:40:45    

Beh si tu veux quand j utilise un script qui contient tous les modules à la suite et qu'il traite l'ensemble des textes module par module, c'est assez performant, c'était juste que je me disais que pour optimiser encore le process je pourrais découper chaque module pour en faire un script indépendant.
Mais bon tu m'as bien expliqué que ça n'irait pas plus vite.
Pour info peux tu me dire comment  je peux utiliser les variables d environnement..?
Le code est trop long...

Reply

Marsh Posté le 05-10-2005 à 12:18:22    

les variables d'environnement sont accessible par une hash speciale en perl: %ENV
si tu met qqchose dedans ou que tu modifie une entrée elle restera modifiée pour al suite de ton prog (ou pour tout autre prog que tu executera dans ton script). par contre elle sera remise à sa valeur initiale kand tu quittera ton prog
 
c'est utiliser pour passer les parametres à un script CGI par exemple

Reply

Marsh Posté le 05-10-2005 à 13:03:31    

dc on y a accès n'importe quand...le seul truc c'est qu'il faut se méfier qu'entre deux fins de modules l'un des modules suivant ne prenne pas la variable de l'autre...

Reply

Marsh Posté le 05-10-2005 à 14:39:29    

attend, si tu reste dans un seul et meme process alors tu n'a pas aucune raison d'utiliser ce mechanisme!
tu appel simplement les fonctiosn de tes differents modules en leur passant les parametres que tu veux (et des references si tu le veux)

Reply

Marsh Posté le 05-10-2005 à 14:41:16    

oui oui ça d'accord...mais je te parlais de l'autre possibilité qui était de faire un script par module...

Reply

Marsh Posté le 05-10-2005 à 14:44:01    

dasn tous les cas c'est une mauvaise solution.
mais normalement les modification de %ENV n'affecent que le programme en cours et ceux qui seront executés depuis celui ci, pas les autres. Apres tu peux imaginer identifier tes clé de maniere unique (en ajoutant un PID par exemple) mais bon...

Reply

Marsh Posté le 05-10-2005 à 15:43:58    

vas y vas y ça m'intéresse, cette histoire de PID, t'as un peu plus de détails?

Reply

Marsh Posté le 05-10-2005 à 17:31:43    

non, c'est le genre de bidouille pourrie qu'on fait au cas par cas, et avec honte. ca depend compeltement de ce que tu veux faire

Reply

Marsh Posté le 05-10-2005 à 18:35:09    

T as un lien ou je peux me renseigner?

Reply

Marsh Posté le 06-10-2005 à 08:45:41    

non désolé
tu peux toujours regarder perlipc (perldoc peripc) ou le module thread pour des strategies plus fines

Reply

Marsh Posté le 06-10-2005 à 12:09:11    

En tout cas merci pour tout cher pospos

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed