Trong quá trình vector hóa một số mã mô phỏng, tôi đã gặp sự cố bộ nhớ. Tôi đang sử dụng phiên bản 32 bit R 2.15.0 (thông qua phiên bản RStudio 0.96.122) trong Windows XP. Máy của tôi có RAM 3,46 GB.Phân bổ bộ nhớ "Lỗi: không thể phân bổ vectơ có kích thước 75,1 Mb"
> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.0-6 lattice_0.20-6 MASS_7.3-18
loaded via a namespace (and not attached):
[1] grid_2.15.0 tools_2.15.0
Dưới đây là một ví dụ rất nhỏ của vấn đề:
> memory.limit(3000)
[1] 3000
> rm(list = ls())
> gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 1069761 28.6 1710298 45.7 1710298 45.7
Vcells 901466 6.9 21692001 165.5 173386187 1322.9
> N <- 894993
> library(MASS)
> sims <- mvrnorm(n = N, mu = rep(0, 11), Sigma = diag(nrow = 11))
> sims <- mvrnorm(n = N + 1, mu = rep(0, 11), Sigma = diag(nrow = 11))
Error: cannot allocate vector of size 75.1 Mb
(Trong ứng dụng của tôi ma trận hiệp phương sai Sigma không phải là đường chéo, nhưng tôi nhận được lỗi tương tự trong hai cách.)
tôi đã dành buổi chiều đọc về các vấn đề phân bổ bộ nhớ trong R (bao gồm here, here và here). Từ những gì tôi đã đọc, tôi nhận được ấn tượng rằng nó không phải là vấn đề của RAM có sẵn cho mỗi người, mà là không gian địa chỉ liên tục có sẵn. Tuy nhiên, 75,1Mb có vẻ khá nhỏ đối với tôi.
Tôi đánh giá cao mọi suy nghĩ hoặc đề xuất mà bạn có thể có.
Trong ví dụ trên, N là 894993. Tôi đã hy vọng tránh sử dụng vòng lặp hoặc một số biến thể áp dụng nhưng có lẽ tôi không thể trong trường hợp này. – inhuretnakht
@ user1426701 Không, bạn không thể. Tại sao mọi người trên [SO] gần đây lại muốn tránh sử dụng vòng lặp trong R? Không có gì sai khi sử dụng chúng và chúng nhanh chóng, miễn là bạn thiết lập lưu trữ cho kết quả đầu tiên và sau đó điền vào đối tượng đó khi bạn lặp lại. –
Trong ví dụ cụ thể này, khi tôi giảm số lần sao chép để vấn đề bộ nhớ này không phát sinh, phiên bản không có vòng lặp nhanh hơn gần 5 lần. Nó không phải là quá nhiều một vấn đề muốn tránh các vòng hoàn toàn như để đi từ ba vòng lồng nhau đến hai. – inhuretnakht