Problème de mémoire

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Varin Thibault
Messages : 31
Enregistré le : 08 Nov 2006, 11:23

Problème de mémoire

Messagepar Varin Thibault » 14 Nov 2006, 16:44

Bonjour, j'utilise R pour effectuer le clustering d'une chimiothèque. La chimiothèque que j'utilise actuellement contient environ 8500 composés.
J'ai tout d'abord généré une matrice de dissimilarité (avec la fonction "fp.sim.matrix")de dimension (8500*8500) puis j'ai utilisé la fonction "agnes" pour générer un dendrogramme.
J'ai ensuite utilisé différentes fonctions permettant d'explorer cette clusterisation. J'utilise nottamment "cutree" qui me renvoie pour chaque composé le numéro du cluster auquel il appartient à un niveau K et la fonction silhouette qui permet de déterminer pour chaque composé l'indice Silhouette. Dès les premières utilisations de ces fonctions j'ai eu des problèmes de mémoire indiquées par le message "impossible d'allouer un vecteur de taille 552169 ko".
D'après ce que j'ai compris(et ça a d'ailleurs déjà été traité dans le forum), R semble stocker ses variables dans la mémoire vive. J'ai donc relancé l'ordinateur afin de libérer toute la mémoire vive. Avant de relancer R j'ai regardé l'état de la mémoire de ma station (Linux RedHat). J'ai donc quand rien ne tourne : 220 Mo de mémoire vive utilisée (et une capacité de 2Go), 0 Mo de mémoire paginée (et une capacité de 2 Go).
Après avoir lancé R (la matrice de dissimilarité et l'objet Agnes sont chargés au départ), l'état de la mémoire est le suivant : 700 Mo de mémoire vive utilisés et 0 Mo de mémoire paginée utilisée.
Je lance donc successivement les fonction cutree et silhouette. J'obtient des résultats. Puis je souhaite relancer ces fonctions avec des paramètres différents et donc j'utilise la fonction rm() pour effacer les variables générées et donc libérer la mémoire. Cependant alors que je croyais être dans la même configuration que lors du lancement de R, l'état de la mémoire a encore changé : 1.2 Go de mémoire vive utilisée et 1.1Go de mémoire paginée utilisée...
Je relance donc les deux fonctions cutree et silhouette, celles-ci donnent encore des résultats. Mais au troisième lancement, le message d'erreur "impossible d'allouer un vecteur..." apparaît.
Est-ce que quelqu'un sait comment gérer ce problème de mémoire? Je pourrais éteindre et relancer R toutes les 2 opérations, mais j'ai besoin d'effectuer des boucles avec ces fonctions et je suis donc bloqué...
Je ne comprend pas pourquoi ma mémoire vive et ma mémoire paginée ne retrouvent pas leur état d'origine après avoir utilisé la fonction rm() pour effacer les variables!!!
J'ai regardé dans le mode d'emploi, il y a bien des fonctions comme "memory.size ou memory.limit" qui permettent d'étendre l'accès de R à la mémoire, mais si j'ai bien compris, les paramètres par défaut sous Linux sont déjà au maximum...
De plus R n'utilise pas toute la mémoire paginée disponible...
Si quelqu'un peut m'aider à résoudre ce problème... Merci beaucoup!!!
Juste deux autres questions plus simples
1. Pour enregistrer ma matrice de dissimilarité, j'utilise la fonction write.table, cependant quand je veux la charger, cela prend beaucoup plus de temps que quand elle est enregistrée dans l'environnement de R... y a-t-il une solution?
2. Je n'arrive pas à enregistrer mon objet Agnes, j'ai essayé la fonction "save" en mode binaire ou ascii, mais lorsque je recharge cet objet avec la fonction "load" la variable est vide... c'est pour cela que je la sauve dans l'environnement de R...
Merci beaucoup

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Problème de mémoire

Messagepar Renaud Lancelot » 14 Nov 2006, 18:17

Varin Thibault a écrit :Bonjour, j'utilise R pour effectuer le clustering d'une chimiothèque. La chimiothèque que j'utilise actuellement contient environ 8500 composés.
J'ai tout d'abord généré une matrice de dissimilarité (avec la fonction "fp.sim.matrix")de dimension (8500*8500) puis j'ai utilisé la fonction "agnes" pour générer un dendrogramme.
J'ai ensuite utilisé différentes fonctions permettant d'explorer cette clusterisation. J'utilise nottamment "cutree" qui me renvoie pour chaque composé le numéro du cluster auquel il appartient à un niveau K et la fonction silhouette qui permet de déterminer pour chaque composé l'indice Silhouette. Dès les premières utilisations de ces fonctions j'ai eu des problèmes de mémoire indiquées par le message "impossible d'allouer un vecteur de taille 552169 ko".
D'après ce que j'ai compris(et ça a d'ailleurs déjà été traité dans le forum), R semble stocker ses variables dans la mémoire vive. J'ai donc relancé l'ordinateur afin de libérer toute la mémoire vive. Avant de relancer R j'ai regardé l'état de la mémoire de ma station (Linux RedHat). J'ai donc quand rien ne tourne : 220 Mo de mémoire vive utilisée (et une capacité de 2Go), 0 Mo de mémoire paginée (et une capacité de 2 Go).
Après avoir lancé R (la matrice de dissimilarité et l'objet Agnes sont chargés au départ), l'état de la mémoire est le suivant : 700 Mo de mémoire vive utilisés et 0 Mo de mémoire paginée utilisée.
Je lance donc successivement les fonction cutree et silhouette. J'obtient des résultats. Puis je souhaite relancer ces fonctions avec des paramètres différents et donc j'utilise la fonction rm() pour effacer les variables générées et donc libérer la mémoire. Cependant alors que je croyais être dans la même configuration que lors du lancement de R, l'état de la mémoire a encore changé : 1.2 Go de mémoire vive utilisée et 1.1Go de mémoire paginée utilisée...
Je relance donc les deux fonctions cutree et silhouette, celles-ci donnent encore des résultats. Mais au troisième lancement, le message d'erreur "impossible d'allouer un vecteur..." apparaît.
Est-ce que quelqu'un sait comment gérer ce problème de mémoire? Je pourrais éteindre et relancer R toutes les 2 opérations, mais j'ai besoin d'effectuer des boucles avec ces fonctions et je suis donc bloqué...
Je ne comprend pas pourquoi ma mémoire vive et ma mémoire paginée ne retrouvent pas leur état d'origine après avoir utilisé la fonction rm() pour effacer les variables!!!
J'ai regardé dans le mode d'emploi, il y a bien des fonctions comme "memory.size ou memory.limit" qui permettent d'étendre l'accès de R à la mémoire, mais si j'ai bien compris, les paramètres par défaut sous Linux sont déjà au maximum...
De plus R n'utilise pas toute la mémoire paginée disponible...
Si quelqu'un peut m'aider à résoudre ce problème... Merci beaucoup!!!


1. Lancer gc() après rm() pour récupérer la mémoire libérée.

2. Voir sur ce forum le sujet http://forums.cirad.fr/logiciel-R/viewtopic.php?t=223

Juste deux autres questions plus simples
1. Pour enregistrer ma matrice de dissimilarité, j'utilise la fonction write.table, cependant quand je veux la charger, cela prend beaucoup plus de temps que quand elle est enregistrée dans l'environnement de R... y a-t-il une solution?


Pas sûr. Voir ?save et ?save.image et les liens associés.

2. Je n'arrive pas à enregistrer mon objet Agnes, j'ai essayé la fonction "save" en mode binaire ou ascii, mais lorsque je recharge cet objet avec la fonction "load" la variable est vide... c'est pour cela que je la sauve dans l'environnement de R...
Merci beaucoup


Bien lire l'aide de save. Les objets sont sauvés dans un fichier déclaré dans l'argument file. On ne peut pas faire qque chose comme

Code : Tout sélectionner

x <- save(blabla)

Renaud

Varin Thibault
Messages : 31
Enregistré le : 08 Nov 2006, 11:23

Problème de Mémoire

Messagepar Varin Thibault » 15 Nov 2006, 16:12

Bonjour, je ne comprend pas pourquoi mais ma matrice de similarité était enregistrée comme objet data.frame (je vais aller vérifier si c'est la fonction fp.matrix.sim qui est en cause ou si j'ai fait une mauvaise manip, sûrement). Je l'ai donc reconvertit en objet matrice et R arrive alors à gérer la mémoire vive.
Mais cela continue de m'intriguer car avant de me rendre compte de cette erreur, j'ai utilisé la fonction gc(reset=T) pour libérer la mémoire vive suite à l'effacement des variables de grande taille avec la fonction rm(). Effectivement dans les indices données par gc(), on voyait que la mémoire totale était libérée, mais dans le moniteur de linux red hat, la mémoire vive continuait à être occupée et montait par palier à chaque fois que je travaillais sur cet objet data.frame...
Une fois cet objet convertit en matrice, la fonction gc(reset=T) marche parfaitement, le moniteur de linux indique bien que la mémoire vive est libérée....
Cela est maintenant moins important pour moi, mais quand j'utilise une autre fonction (clusplot), ce problème de taille de vecteur réapparait. Mais ça doit être maintenant un manque réel de mémoire vive je suppose...
Quand je lance cette fonction, la mémoire vive utilisée est de 2 Go mais la mémoire paginée utilisée est de 1,1Go sur deux Go disponibles... Est-ce que quelqu'un sait s'il y a possibilité de forcer R à utiliser la mémoire paginée restante?
Lors de l'utilisation de gc, je n'ai pas bien compris les valeurs de "gc trigger", est-ce un seuil à partir duquel gc(reset=T) est lancé automatiquement, et est-ce qu'il est possible de le diminuer?
Sinon la fonction save marche parfaitement maintenant, c'était en fait un problème de syntaxe en chargeant les variables...
Merci beaucoup!!!

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Re: Problème de Mémoire

Messagepar Renaud Lancelot » 15 Nov 2006, 17:37

Varin Thibault a écrit :Bonjour, je ne comprend pas pourquoi mais ma matrice de similarité était enregistrée comme objet data.frame (je vais aller vérifier si c'est la fonction fp.matrix.sim qui est en cause ou si j'ai fait une mauvaise manip, sûrement). Je l'ai donc reconvertit en objet matrice et R arrive alors à gérer la mémoire vive.
Mais cela continue de m'intriguer car avant de me rendre compte de cette erreur, j'ai utilisé la fonction gc(reset=T) pour libérer la mémoire vive suite à l'effacement des variables de grande taille avec la fonction rm(). Effectivement dans les indices données par gc(), on voyait que la mémoire totale était libérée, mais dans le moniteur de linux red hat, la mémoire vive continuait à être occupée et montait par palier à chaque fois que je travaillais sur cet objet data.frame...
Une fois cet objet convertit en matrice, la fonction gc(reset=T) marche parfaitement, le moniteur de linux indique bien que la mémoire vive est libérée....
Cela est maintenant moins important pour moi, mais quand j'utilise une autre fonction (clusplot), ce problème de taille de vecteur réapparait. Mais ça doit être maintenant un manque réel de mémoire vive je suppose...
Quand je lance cette fonction, la mémoire vive utilisée est de 2 Go mais la mémoire paginée utilisée est de 1,1Go sur deux Go disponibles... Est-ce que quelqu'un sait s'il y a possibilité de forcer R à utiliser la mémoire paginée restante?


Non: je travaille sous Windows et je ne pense pas qu'on puisse transposer. Cette question de gestion de la mémoire est régulièrement abordée sur R-Help et ça vaut le coup de fouiller les archives. Par ailleurs, voir dans l'aide en ligne ce qui est écrit à ?Memory (avec un "M" et non un "m").

Lors de l'utilisation de gc, je n'ai pas bien compris les valeurs de "gc trigger", est-ce un seuil à partir duquel gc(reset=T) est lancé automatiquement, et est-ce qu'il est possible de le diminuer?


Je ne sais pas.

Sinon la fonction save marche parfaitement maintenant, c'était en fait un problème de syntaxe en chargeant les variables...
Merci beaucoup!!!


OK, bonne chance !

Renaud


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron