Tham chiếu vs. Bản sao

Xử lý dữ liệu có khả năng mở rộng trong R

Simon Urbanek

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

Big matrices và matrices - Tương đồng

  • Lấy tập con
  • Gán
Xử lý dữ liệu có khả năng mở rộng trong R

Big matrices và matrices - Khác biệt

  • big.matrix được lưu trên đĩa
  • Tồn tại qua các phiên R
  • Có thể chia sẻ giữa các phiên R
Xử lý dữ liệu có khả năng mở rộng trong R

R thường tạo bản sao khi gán

Lệnh này tạo một bản sao của a và gán cho b.

a <- 42
b <- a
a
42
b
42
a <- 43
a
43
b
42
Xử lý dữ liệu có khả năng mở rộng trong R

R thường tạo bản sao khi gán

a <- 42

foo <- function(a){a <- 43 paste("Inside the function a is", a)}
foo(a)
"Inside the function a is 43"
paste("Outside the function a is still", a)
"Outside the function a is still 42"
Xử lý dữ liệu có khả năng mở rộng trong R

Không phải mọi đối tượng R đều được sao chép

Hàm này có thay đổi giá trị của a trong môi trường global

foo <- function(a) {a$val <- 43 
                    paste("Inside the function a is", a$val)}
a <- environment()
a$val <- 42
foo(a)
"Inside the function a is 43"
paste("Outside the function a$val is", a$val)
"Outside the function a$val is 43"
Xử lý dữ liệu có khả năng mở rộng trong R

deepcopy()

# x là một big matrix
x <- big.matrix(...)

# x_no_copy và x tham chiếu cùng một đối tượng
x_no_copy <- x

# x_copy và x là các đối tượng khác nhau
x_copy <- deepcopy(x)

Xử lý dữ liệu có khả năng mở rộng trong R

Hành vi tham chiếu

R sẽ không ngầm tạo bản sao

  • Giảm dùng bộ nhớ
  • Rút ngắn thời gian chạy
Xử lý dữ liệu có khả năng mở rộng trong R

Không phải mọi đối tượng R đều được sao chép

library(bigmemory)

x <- big.matrix(nrow = 1, ncol = 3, type = "double", 
                init = 0, 
                backingfile = "hello-bigmemory.bin", 
                descriptorfile = "hello-bigmemory.desc")
Xử lý dữ liệu có khả năng mở rộng trong R

Không phải mọi đối tượng R đều được sao chép

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
Xử lý dữ liệu có khả năng mở rộng trong R

Không phải mọi đối tượng R đều được sao chép

x_copy <- deepcopy(x)
x[,]
1 1 1
x_copy[,]
1 1 1
x[,] <- 2
x[,]
2 2 2
x_copy[,]
1 1 1
Xử lý dữ liệu có khả năng mở rộng trong R

Cùng luyện tập nào!

Xử lý dữ liệu có khả năng mở rộng trong R

Preparing Video For Download...