Références vs copies

Traitement de données évolutif en R

Simon Urbanek

Member of R-Core, Lead Inventive Scientist, AT&T Labs Research

Grandes matrices et matrices - Similarités

  • Sous-ensemble
  • Affecter
Traitement de données évolutif en R

Grandes matrices et matrices - Différences

  • big.matrix est stockée sur le disque
  • Persiste entre les sessions R
  • Peut être partagée entre des sessions R
Traitement de données évolutif en R

R crée généralement des copies lors de l'affectation

Ceci crée une copie de a et l'affecte à b.

a <- 42
b <- a
a
42
b
42
a <- 43
a
43
b
42
Traitement de données évolutif en R

R crée généralement des copies lors de l'affectation

a <- 42

foo <- function(a){a <- 43 paste("Inside the function a is", a)}
foo(a)
"À l'intérieur de la fonction, a vaut 43"
paste("Outside the function a is still", a)
"À l'extérieur de la fonction, a vaut encore 42"
Traitement de données évolutif en R

Tous les objets R ne sont pas copiés

Cette fonction modifie bien la valeur de a dans l'environnement global

foo <- function(a) {a$val <- 43 
                    paste("Inside the function a is", a$val)}
a <- environment()
a$val <- 42
foo(a)
"À l'intérieur de la fonction, a vaut 43"
paste("Outside the function a$val is", a$val)
"À l'extérieur de la fonction, a$val vaut 43"
Traitement de données évolutif en R

deepcopy()

# x est une grande matrice
x <- big.matrix(...)

# x_no_copy et x renvoient au même objet
x_no_copy <- x

# x_copy et x renvoient à des objets différents
x_copy <- deepcopy(x)

Traitement de données évolutif en R

Comportement par référence

R ne fera pas de copies implicitement

  • Minimiser l'usage de la mémoire
  • Réduire le temps d'exécution
Traitement de données évolutif en R

Tous les objets R ne sont pas copiés

library(bigmemory)

x <- big.matrix(nrow = 1, ncol = 3, type = "double", 
                init = 0, 
                backingfile = "hello-bigmemory.bin", 
                descriptorfile = "hello-bigmemory.desc")
Traitement de données évolutif en R

Tous les objets R ne sont pas copiés

x_no_copy <- x
x[,]
0 0 0
x_no_copy[,]
0 0 0
x[,] <- 1
x[,]
1 1 1
x_no_copy[,]
1 1 1
Traitement de données évolutif en R

Tous les objets R ne sont pas copiés

x_copy <- deepcopy(x)
x[,]
1 1 1
x_copy[,]
1 1 1
x[,] <- 2
x[,]
2 2 2
x_copy[,]
1 1 1
Traitement de données évolutif en R

Passons à la pratique !

Traitement de données évolutif en R

Preparing Video For Download...