Chapitre 7. Maintenance des sessions
329
Attention
Lors de la cr´ eation d’un objet de grande taille, la m´ emoire r´ eserv´ ee par
R doit l’ˆ etre de fa¸ con contigu¨ e (non fragment´ ee sur plusieurs cases).
Il est donc possible qu’il reste suffisament de m´ emoire vive (au total) disponible pour R, mais pas de « trou » assez grand pour y faire rentrer les donn´ ees
d’un seul objet de grande taille. En voici une illustration. Prenez garde toutefois que ces commandes pourraient entraˆ ıner un ralentissement cons´ equent de
votre syst` eme, voire mˆ eme une sortie brutale de R.
> # En premier lieu, nous avons tapé les instructions:
# rm(list=ls()) ; gc() ; gc() # pour vider la mémoire.
> P <- 14000
> D <- matrix(rep(0, P * P), nrow=P)
Erreur : impossible d’allouer un vecteur de taille 1.5 Go
> # Alors que l’allocation suivante est certainement possible,
# après avoir tapé gc();gc() # pour vider la mémoire.
> Q <- round(sqrt(P^2/2))
> D1 <- matrix(rep(0, Q * Q), nrow=Q)
> D2 <- matrix(rep(0, Q * Q), nrow=Q)
> # La somme des tailles de D1 et D2 fait approximativement 1.5 Go
> object.size(D1) + object.size(D2)
1567843440 bytes
Ainsi, dans l’exemple ci-dessus, il n’a pas ´ et´ e possible de cr´ eer un seul objet
de taille 1.5 Go, alors qu’il a ´ et´ e possible de cr´ eer deux objets de mˆ eme taille
approximativement ´ egale ` a 0.75 Go. C’est un probl` eme de fragmentation de la
m´ emoire.
Astuce
Notons que sur un processeur 64 bits, nous n’aurions probablement pas
rencontr´ e ce probl` eme, mˆ eme lors de la cr´ eation d’un objet de taille approximativement ´ egale ` a 3 Go :
> # En premier lieu nous avons tapé les instructions
# rm(list=ls()) ; gc() ; gc() # pour vider la mémoire.
> P <- 20000
> D <- matrix(rep(0, P * P), nrow=P)
> object.size(D)
> 3200000200 bytes
7.8.5 Quelques recommandations
Une compr´ ehension ´ el´ ementaire de la gestion de la m´ emoire dans un ordinateur en g´ en´ eral, et par R en particulier, pourra s’av´ erer tr` es utile afin d’iden-
329
Attention
Lors de la cr´ eation d’un objet de grande taille, la m´ emoire r´ eserv´ ee par
R doit l’ˆ etre de fa¸ con contigu¨ e (non fragment´ ee sur plusieurs cases).
Il est donc possible qu’il reste suffisament de m´ emoire vive (au total) disponible pour R, mais pas de « trou » assez grand pour y faire rentrer les donn´ ees
d’un seul objet de grande taille. En voici une illustration. Prenez garde toutefois que ces commandes pourraient entraˆ ıner un ralentissement cons´ equent de
votre syst` eme, voire mˆ eme une sortie brutale de R.
> # En premier lieu, nous avons tapé les instructions:
# rm(list=ls()) ; gc() ; gc() # pour vider la mémoire.
> P <- 14000
> D <- matrix(rep(0, P * P), nrow=P)
Erreur : impossible d’allouer un vecteur de taille 1.5 Go
> # Alors que l’allocation suivante est certainement possible,
# après avoir tapé gc();gc() # pour vider la mémoire.
> Q <- round(sqrt(P^2/2))
> D1 <- matrix(rep(0, Q * Q), nrow=Q)
> D2 <- matrix(rep(0, Q * Q), nrow=Q)
> # La somme des tailles de D1 et D2 fait approximativement 1.5 Go
> object.size(D1) + object.size(D2)
1567843440 bytes
Ainsi, dans l’exemple ci-dessus, il n’a pas ´ et´ e possible de cr´ eer un seul objet
de taille 1.5 Go, alors qu’il a ´ et´ e possible de cr´ eer deux objets de mˆ eme taille
approximativement ´ egale ` a 0.75 Go. C’est un probl` eme de fragmentation de la
m´ emoire.
Astuce
Notons que sur un processeur 64 bits, nous n’aurions probablement pas
rencontr´ e ce probl` eme, mˆ eme lors de la cr´ eation d’un objet de taille approximativement ´ egale ` a 3 Go :
> # En premier lieu nous avons tapé les instructions
# rm(list=ls()) ; gc() ; gc() # pour vider la mémoire.
> P <- 20000
> D <- matrix(rep(0, P * P), nrow=P)
> object.size(D)
> 3200000200 bytes
7.8.5 Quelques recommandations
Une compr´ ehension ´ el´ ementaire de la gestion de la m´ emoire dans un ordinateur en g´ en´ eral, et par R en particulier, pourra s’av´ erer tr` es utile afin d’iden-
