help(memory.size)

R et systèmes d'exploitation, configuration de R, gestion de la mémoire, construction des packages, interfaces entre R et d'autres logiciels, éditeurs pour R

Modérateur : Groupe des modérateurs

Jean-Pierre Rossi
Messages : 20
Enregistré le : 13 Sep 2006, 11:17
Contact :

help(memory.size)

Messagepar Jean-Pierre Rossi » 14 Sep 2006, 13:52

Bonjour,

Voici une question liée à la gestion de la mémoire sous R (je travaille sous windows XP, R version 2.3.1). Je réalise des calculs à partir d'un script qui marche bien, je l'ai testé sur de petits jeux de données. Avec les jeux de données les plus grands j'ai le message d'erreur suivant:

Reached total allocation of 1023Mb: see help(memory.size)

Je ne comprends pas très bien comment allouer plus de ram à R, en particulier, comment utiliser memory.limit(size = xxx).

Si quelqu'un peut m'aider....Merci!
Jean-Pierre Rossi
INRA, UMR CBGP (INRA / IRD / Cirad / Montpellier SupAgro)
Campus international de Baillarguet, France

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 14 Sep 2006, 15:12

bonjour,

au risque de ne pas être très constructif, je ne vois pas beaucoup de solution pour résoudre ce problème:

- alléger la procédure pour éviter de créer trop d'objet temporaire.
- éviter l'utilisation des objects data.frame et list
- acheter de la mémoire (désolé ... elle était facile celle-là :D)
- bidouiller la mémoire virtuelle (avec les risques que cela peut comporter)
- faire une dll (par exemple en C, C++ ou fortran)

si c'est pour mettre des données en forme,
il reste peut-être aussi Python,
ou awk & co (cf cygwin, MinGW) ...

"memory.limit" semble servir à forcer la limitation de mémoire.
par contre, il faut faire attention la taille (size) doit être donnée en Mb.
mais bon, je n'ai jamais utilisé cette commande .. :(
voici un p'tit exemple d'utilisation:

Code : Tout sélectionner

> memory.limit()
[1] 535543808
> round(memory.limit()/1048576.0, 2)
[1] 510.73
> memory.limit(size=600)
NULL
> mat1 <- matrix(rep(1,4*1e4),5)
> mat2 <- matrix(rep(2,4*1e4),5)
> ted <- t(mat1)%*%mat2
Erreur : impossible d'allouer un vecteur de taille 500000 Ko
De plus : Warning messages:
1: Reached total allocation of 600Mb: see help(memory.size)
2: Reached total allocation of 600Mb: see help(memory.size)
> memory.limit(size=1000)
NULL
> ted <- t(mat1)%*%mat2
> memory.limit()
[1] 1048576000
> round(memory.limit()/1048576.0, 2)
[1] 1000



en espérant avoir aider un peu,

@+++

Pierre



PS : petit test :

Code : Tout sélectionner

> memory.limit(size = 1e12)
Erreur dans memory.size(size) : ne soyez pas stupide ! Votre machine a une limite de mémoire adressable de 4 Go

ça m'a bien fait rire :D
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

E.V. Dennst

Re: help(memory.size)

Messagepar E.V. Dennst » 14 Sep 2006, 15:13

Jean-Pierre Rossi a écrit :Bonjour,
... Je ne comprends pas très bien comment allouer plus de ram à R

Je réponds un peu à coté, mais ça peut peut-être servir.
J'ai eu un souci similaire, mais que j'ai règlé non pas en augmentant la RAM, mais en diminuant la consommation mémoire grâce aux moyens suivants :
- gc() réguliers, voir ?gc
- dans le cas de grands tableaux d'entiers, bien veiller à les allouer en tant qu'entiers via as.integer(), sinon par défaut c'est double, càd double tarif,
- object.size() pour vérifier la conso.

Voir aussi
un message récent (09/07) de B. Ripley sur R-help "memory allocation"
?"Memory-limits"
?storage.mode
?mem.limits
eça

Jean-Pierre Rossi
Messages : 20
Enregistré le : 13 Sep 2006, 11:17
Contact :

Messagepar Jean-Pierre Rossi » 14 Sep 2006, 15:29

Merci beaucoup pour toutes ces informations. :)
Jean-Pierre Rossi

INRA, UMR CBGP (INRA / IRD / Cirad / Montpellier SupAgro)

Campus international de Baillarguet, France

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

Messagepar Renaud Lancelot » 14 Sep 2006, 15:34

Bonjour Jean-Pierre,

R ne dispose pas du même mécanisme que S+ pour utiliser le disque dur et stocker des résultats intermédiaire pour des calculs très lourds (souvent pb de classif, de MCMC, etc.). Tout se déroule dans la RAM qui est donc un facteur limitant critique.

Voir l'aide de memory.size (taper ?memory.size) ainsi que la FAQ 2.9 pour Windows.

Si vous n'avez pas plus de 1 Go de RAM, la seule solution est, je pense, d'acheter des barrettes de RAM supplémentaires. Si vous avez déjà plus de 1 Go, vous pouvez lancer R avec le flag --max-mem-size ajusté à la valeur de RAM dont vous disposez. En clair, si vous lancer Rgui depuis un raccourci situé sur votre bureau Windows, ouvrez les propriétés du raccourci, et dans le champ "cible", taper qque chose comme

C:\R\R-2.3.1\bin\Rgui.exe --max-mem-size=2000

si vous disposez de 2 Go de RAM (il y a d'autres flags permettant des réglages fins de chaque session: sauvegarde, nature de l'interface,...).

Je crois que Windows ne gère pas plus de 3 Go de RAM, et qu'il faut prendre qques dispositions particulières si on est entre 2 et 3.

D'une manière plus générale, il est parfois possible de contourner les pbs de mémoire insuffisante en optimisant le code, ou en utilisant des packages spécialisés. Il y a par exemple un package dédié aux problèmes de régression sur de très gros tableaux: biglm.

Renaud

Delphine Meziere
Messages : 7
Enregistré le : 29 Nov 2010, 17:57

Augmenter la taille du workspace

Messagepar Delphine Meziere » 02 Aoû 2012, 17:49

Bonjour,

une petite astuce en plus de celles proposées par E.V. Dennst : augmenter la taille du workspace.

C'est le seul moyen que j'ai trouvé pour pouvoir fusionner sans problème 2 gros gros fichiers.

Code : Tout sélectionner

print(object.size(Weeds))
182376840 bytes

Code : Tout sélectionner

print(object.size(Crops))
2010680 bytes

Code : Tout sélectionner

NewWeeds=merge(Crops[,c(1,2)],Weeds, by=c(1,2), all.y=TRUE, all=FALSE, sort=TRUE)
Erreur : impossible d'allouer un vecteur de taille 13.4 Mo


en rajoutant l'argument workspace ce n'est peut-être pas très propre, mais cela marche :

Code : Tout sélectionner

NewWeeds=merge(Crops[,c(1,2)],Weeds, by=c(1,2), all.y=TRUE, all=FALSE, sort=TRUE, workspace = 200000)


Retourner vers « Archives : Environnement de R »

Qui est en ligne

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

cron