Problème d'allocation de la mémoire [PERL] - Perl - Programmation
Marsh Posté le 09-10-2002 à 18:47:23
essaie de travailler avec la fonction fork() elle permet de créer des thread (procesus).
En faite tu execute 1 fois ton programme, ensuite tu cré des taches qui vont s'executer en meme! c une solution qui permet de faire plusieur chose en meme temps sans avoir à executer plusieurs fois 1 meme programme. regarde dans la doc de Perl pour cette fonction
Marsh Posté le 09-10-2002 à 19:42:52
merci
Oui je connais cette fonction, mais la j'ai besoin que chaque instance du programme soit réellement un processus indépendant au niveau de l'os
Je cherche en fait un moyen de ne pas recharger des dll deja en memoire
je precise que je suis sous w2k
ca changerai kkchose sous linux?
Marsh Posté le 10-10-2002 à 09:49:31
pospos a écrit a écrit : merci Oui je connais cette fonction, mais la j'ai besoin que chaque instance du programme soit réellement un processus indépendant au niveau de l'os Je cherche en fait un moyen de ne pas recharger des dll deja en memoire je precise que je suis sous w2k ca changerai kkchose sous linux? |
Oui, ben justement ! Avec un fork(), tu pourrais gérer plusieurs processus indépendant en même temps. C'est à toi de modifier ton programme pour qu'il intègre une gestion multiple des tâches que chacun de tes processus doit faire.
Marsh Posté le 15-10-2002 à 10:35:01
merci mais ce k'il me faut ce sont de vrais process au niveau du systeme, alors que sous windows le fork() n'est k'une emulation pourrie du vrai fork unix.
si je fork sous windows je ne fait que créer des "similis process" et si j'en kill un il ne rend pas sa memoire!
donc, puisque je suis obligé de lancer ca sous windows, j'aimerais savoir pourkoi il me charge toutes les dll à chaque fois, pour chaque proces!!
merci
Marsh Posté le 16-10-2002 à 17:25:23
a part le fork je voi pas dsl
Marsh Posté le 16-10-2002 à 18:06:06
ok merci
et donc pour toi c'est normal que des dll deja presentes en memoire soient chargée à nouveau sous win2000?
sous linux ca fait ca aussi?
moi je trouve pas ca tres normal, c'est des librairies dynamique, donc logiquemetn c'est present une foi en memoire et point barre non?
ca m'enerve de bouffer 20mo pour chaque p**ain d'instance de ce p**ain de programme
Marsh Posté le 17-10-2002 à 10:43:09
pospos a écrit a écrit : ok merci et donc pour toi c'est normal que des dll deja presentes en memoire soient chargée à nouveau sous win2000? sous linux ca fait ca aussi? moi je trouve pas ca tres normal, c'est des librairies dynamique, donc logiquemetn c'est present une foi en memoire et point barre non? ca m'enerve de bouffer 20mo pour chaque p**ain d'instance de ce p**ain de programme |
y a po de dll sous Linux
je pense que Linux est un OS vraiment bien foutu (eh les gars d'OSA, pensez à mon p'tit chèque de fin de mois ), il ne doit pas avoir besoin de lancer Perl autant de fois en mémoire que de processus.
Mais sous Windows apparemment, ben ...
Marsh Posté le 17-10-2002 à 19:31:47
pospos a écrit a écrit : ok merci et donc pour toi c'est normal que des dll deja presentes en memoire soient chargée à nouveau sous win2000? sous linux ca fait ca aussi? moi je trouve pas ca tres normal, c'est des librairies dynamique, donc logiquemetn c'est present une foi en memoire et point barre non? ca m'enerve de bouffer 20mo pour chaque p**ain d'instance de ce p**ain de programme |
ben ca depend comment t'as programmé, perso quand j'execute un script Perl sous Win2000 j'ai aucun probleme.
maintenant si tu fait une boucle en utilisant une varible differente pour une meme dll, je dirais OUI c normale
Marsh Posté le 17-10-2002 à 22:11:16
Aricoh a écrit a écrit : y a po de dll sous Linux |
T'as bu ?
y'a pas de fichier avec une extension .dll, ok, mais des bibliotheques chargeables dynamiquement, encore heureux que y'a !
Marsh Posté le 17-10-2002 à 22:30:42
et sous linux elles sont chargée en plusieurs exemplaire si a plusieur process ou non alors?
Marsh Posté le 17-10-2002 à 22:32:02
pospos a écrit a écrit : et sous linux elles sont chargée en plusieurs exemplaire si a plusieur process ou non alors? |
a priori non, mais osus win normalement non plus, et j'a pas testé
Marsh Posté le 18-10-2002 à 09:50:13
pospos a écrit a écrit : j'ai pas trop pigé ton histoire de boucle! |
si tu as
Code :
|
tu charge 5 fois la dll dans 5 variable differentes
Marsh Posté le 18-10-2002 à 10:05:17
ok mais moi je fait ca en perl
donc les dll c'est des module que je "use" en haut de mon code et point bar
et donc je les "use" pour chaque instance du programme
Marsh Posté le 18-10-2002 à 12:09:18
Citation : donc les dll c'est des module que je "use" en haut de mon code et point bar |
si tu fais
Code :
|
et oui
donc faut il que tu revoi ta prog, par la meme ocase, regarde la fonction fork
Marsh Posté le 18-10-2002 à 12:15:04
Pas mal, le nom de l'objet
J'aime bien aussi la boucle for que je décompose comme suit :
i démarre à 1 et tant que i est supérieur ou égal à 5, on se crée une nouvelle couille et i augmente de 1
Ca doit vachement bien marcher, si si sérieux
Marsh Posté le 18-10-2002 à 13:26:15
je comprend pas trop le rapport entre le nombre d'instances d'un objets et le chargement des dll...
et puis fork je peu pas, je suis sur w2k, et ca fait le multi thread pourri a la place
et puis ca changerai rien: il me faut de tte facon une instance par process
Marsh Posté le 18-10-2002 à 13:35:10
pospos a écrit a écrit : je comprend pas trop le rapport entre le nombre d'instances d'un objets et le chargement des dll... et puis fork je peu pas, je suis sur w2k, et ca fait le multi thread pourri a la place et puis ca changerai rien: il me faut de tte facon une instance par process |
pourrais-tu publier au moins le bout de code qui est la cause de tout l'truc STP ?
Marsh Posté le 18-10-2002 à 13:37:45
enfin une parle utile
j'attendais qu'il le fasse de lui-même mais
Marsh Posté le 18-10-2002 à 13:38:55
Aricoh a écrit a écrit : Pas mal, le nom de l'objet J'aime bien aussi la boucle for que je décompose comme suit : i démarre à 1 et tant que i est supérieur ou égal à 5, on se crée une nouvelle couille et i augmente de 1 Ca doit vachement bien marcher, si si sérieux |
le choix de l'objet à été fait exprés, mais ya que toi qui a percuté
Marsh Posté le 18-10-2002 à 14:24:43
le bout de code il fait 5000 lignes
j'ai pas un probleme ponctuel dans un bout de code: je veux simplement lancer plusieurs instances d'un meme programme et je m'etonne de voir les librairies dynamique chargée pour chacune d'elles, c'est tout
voila les librairies que j'utilise:
Base64.dll
Bitmap.dll
Canvas.dll
DBI.dll
Dumper.dll
Entry.dll
Event.dll
Fcntl.dll
GD.dll
HiRes.dll
IO.dll
Listbox.dll
MD5.dll
Menubutton.dll
mysql.dll
NBFrame.dll
OLE.dll
Parser.dll
Photo.dll
Pixmap.dll
POSIX.dll
re.dll
ReadKey.dll
Scale.dll
Scrollbar.dll
SDBM_File.dll
Socket.dll
Tk.dll
Zlib.dll
et bien sure p2x561.dll
ce sont les dll crée par perl2exe au moment de la compilation , mais le probleme est exactement le meme quand j'interprete le code avec perl
je precise que j'utilise active perl (la 633)
Marsh Posté le 18-10-2002 à 14:26:33
Marsh Posté le 18-10-2002 à 16:19:10
il sert a koi ton programme ?
je que tu utilise TK avec des connexions à une base données MySQL, mais comment tu charge tout ca ??
tu bien une partie utilisateur, et une partie traitement ? tu fais pas les deux en même temps ?
c ce genre de détaille que l'on veux
il sert à koi ton prog ? ( à faire le café ? la BD sert à savoir qui prend koi et à kel heure ? )
Marsh Posté le 18-10-2002 à 16:47:39
c'est un robot aspirateur de sites web, genre Wget
il a une interface (TK), il aspire les pages (LWP), il stocke les pages dans une basdo (dbd mysql), et il analyse pendant l'aspiration et genere des rapport avec des graphes (GD graph)
voila
c'est un prototype sur lequel de bosse depusi qq mois, mais comme je voudrais l'utiliser pour des tests de plus grande envergure, j'ai besoin d'optimiser
Marsh Posté le 18-10-2002 à 20:03:28
alors tu doit revoir ton code, quit à refaire certaine routine ou repenser l'embriquement des procedures...
par exemple,c plus lent pour ton appli de grnérer un graph à chaque recup de page. Le faire en dernier une fois le site téléchargé ca me parait un peu mieu
quand tu fait des insertions dans la base, à tu optimisé les tables ? .. ca aussi ca jou beaucoup
Pendant la recup un utilisateur peut-il faire autre chose sur cette meme base ? si oui est-ca bien résonable ?
tes fonctions sont-elles optimisé ?
ensuites tu dit que les DLL TK ce charges à chaques process, je presume donc que tu aspire plusieurs en même temps, est-ce judicieux d'avoir un affichage a chaque téléchargement de page ?
Donc tu voi tous ca fait que ton appli charge 10 fois les même DLL
bref ta encore du boulot sauf si tu demande de l'aide
Marsh Posté le 18-10-2002 à 20:12:09
non c'est pas vraiment ca
l'appli elle meme est plutot optimisée, et fait les rapports kand il faut, et la bdd est optimisée aussi
en fait mon appli ne charge k'une fois les dll, ca ya pas de prob
chaque appli (ce que j'appelais instance ou process dans les questiosn precedents) pompe un site entier
ce qui me pose probleme c'est que, kand je lance plusieurs appli en meme temps, pour pomper plusieurs sites en //, il me recharge les dll pour chaqune d'elles.
Donc ma question est vraiment générique (et c'est toujours la meme!), et ne necessitait pas que je m'etande sur mon programme: est-ce normale que windows recharge une Dll qu'il a deja en memoire si un autre process (dans une autre appli puisque windows ne supporte pas le fork) en a aussi besoin; question subsidiaire: sous unix ca se passerait comment
voila, c'est une simple question, et ca n'a rien a voir avec mon code
Marsh Posté le 19-10-2002 à 10:12:16
tu le dit toi meme, tu lance ton appli 5 fois, Windows doit considérer que c'est 5 programmes differents, donc il change 5 fois les DLL.
Je ne voi pas de probleme de ce coté
c donc ta methode qui ne l'ai pas, c à toi de gérer la gestion tes process mais effectivement le fork n'est pas supporté de la meme façon sous Linux et Windows il sont traité comme des pseudo process, mais tente de l'utiliser au point ou tu en ai
donc mo message juste avant (optimisation,...) et finaliment toujours valable
ya moyen de voir ton appli (pas les sources), mais l'appli finale. Je comprend que tu ne veux pas diffuser les sources mais l'executable. Elle me parait sympa
Marsh Posté le 19-10-2002 à 12:25:21
c'est un outil de recherche, qui ne sera pas diffusé
c'est surtout un prototype destiné a valider des hypotheses et des methodes, et qui ne doit pas etre tres interessant pris à part, il necessite tout un systeme (bdd, plusieurs serveurs, etc.)
J'aimerais eviter de devoir faire un truc multi thread: je veu que chaque site soit traité vraiemnt a part, et je ne veux pas qu'un probleme sur un site (piege à robot, bug à n'importe kel niveau, etc.) mette en perile le reste
je vais tester tout ca sous linux, je pense k'il gere mieux ce genre de librairies dynamiques. apres tout un fork sous unix est exactement un clone du process, donc ca revient au meme d'en lancer deux par exemple, non?
Marsh Posté le 19-10-2002 à 13:54:29
Citation : je vais tester tout ca sous linux, je pense k'il gere mieux ce genre de librairies dynamiques. apres tout un fork sous unix est exactement un clone du process, donc ca revient au meme d'en lancer deux par exemple, non? |
enfin une phrase raisonnable, avec le fork sous linux, tu créer réellement des vrai process different et independant
Citation : je ne veux pas qu'un probleme sur un site (piege à robot, bug à n'importe kel niveau, etc.) mette en perile le reste |
J'ai fait des suceur de site web (precis pour ne recupérer que des infos précises sur un site) qui ne m'ont presque (parceque chuis honnete) jamais fait defaut et ce sans utiliser autre chose que la LWP et MySQL
Citation : c'est surtout un prototype destiné a valider des hypotheses et des methodes, et qui ne doit pas etre tres interessant pris à part, il necessite tout un systeme (bdd, plusieurs serveurs, etc.) |
OK tu veux pas le diffuser, mais ne me reconte pas de connerie,
- la bdd avec phpmyadmin tu sauvegarde la structure (2 mins en prenand son temps)
- plusieurs serveurs, j'y crois pas trop sauf si c la bdd qui ce trouve sur un cluster, la encore le cluster ne sert à faire des sauvegarde ou à accelerer les temps de réponse
- ensuite ya rien besoin d'autre puisque tout en dans les DLL ou l'executable, donc pas d'installation de librairy (fichier.pm) à installer en plus
Marsh Posté le 19-10-2002 à 13:59:01
c'est un projet de recherche, je vais pas le diffuser.
Il peut evidement etre installé aileurs, suriout si je compile en exe, mais ca ne t'apporterais pas grd chose
ma question sur unix reste entiere: faire un fork ca revientau meme que lancer deux fois l'appli aux niveau du chargeemnt des librairies ou ya une differences?
Marsh Posté le 19-10-2002 à 14:00:15
et la bdd est pas petite petite, et ya encore d'autres trucs indispensables qui tournent derriere, qui dependent d'autres projets, et qui sont encore moins diffusables
Marsh Posté le 19-10-2002 à 14:10:09
[citation]
ma question sur unix reste entiere: faire un fork ca revientau meme que lancer deux fois l'appli aux niveau du chargeemnt des librairies ou ya une differences?
[/citation]
ya des differences en faite c ce que je disait plus haut, tu doit travailler avec des fonctions et/ou des classes
mais ensuite il faut vraiment revoir l'interface graphique,
mais va voir l'aide sur le fork, tu l'as sous windows
C:\perl\html\lib\Pod\perlfork.html si tu as installer perl sur le disque C
Citation : c'est un projet de recherche, je vais pas le diffuser. |
ben si voir l'inrterface et comment il fonctionne, sans voir le code c plus difficile mais je peux me faire une idée plus facilement
Marsh Posté le 19-10-2002 à 14:13:19
Citation : et la bdd est pas petite petite, et ya encore d'autres trucs indispensables qui tournent derriere, qui dependent d'autres projets, et qui sont encore moins diffusables |
si ta bdd avait optimisé, tu aurais fait 1 bdd par projet
J'ai des projets moi aussi qui tournent, mais chacun à sa bdd, ca plus simple pour les sauvegarde et pour les modifications
avec aussi (pour la secu) un utilisateurs spéciale pour chaque base...
Marsh Posté le 09-10-2002 à 15:43:48
Bonjour,
Je développe une application en Perl qui devra être lancée en plusieurs exemplaires sur une même machine.
L'application utilise beaucoup de modules, et occupe 20mo à son démarrage. Le problème est que chaque application lancée va occupée 20mo alors qu'elles utilisent toutes les mêmes DLL à priori! Je me retrouve donc avec une occupation mémoire énorme qui m'empeche d'en lancer plus d'une dizaine simuiltanément.
J'ai essayé de compiler le code avec Perl2exe, y compris en version "tiny" (dll dissociée de l'executable) et rien n'y fait: chque instance du programme semble recharger en mémoire toutes les DLL!!
Comment faire?
merci