2012-06-06 42 views
22

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, herehere). 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ó.

Trả lời

25

R đã đến điểm mà hệ điều hành không thể phân bổ nó một đoạn mã khác 75.1Mb RAM. Đó là kích thước của bộ nhớ cần thiết để thực hiện các hoạt động phụ tiếp theo. Nó không phải là một tuyên bố về số lượng RAM tiếp giáp cần thiết để hoàn thành toàn bộ quá trình. Đến thời điểm này, tất cả RAM có sẵn của bạn đã hết nhưng bạn cần thêm bộ nhớ để tiếp tục và hệ điều hành không thể cung cấp thêm RAM cho R.

Các giải pháp tiềm năng cho bộ nhớ này đa dạng. Điều hiển nhiên là giữ máy 64 bit với nhiều RAM hơn. Tôi quên các chi tiết nhưng IIRC trên Windows 32 bit, bất kỳ quá trình nào chỉ có thể sử dụng một lượng RAM giới hạn (2GB?) Và bất kể Windows sẽ giữ lại một đoạn bộ nhớ cho chính nó, vì vậy RAM có sẵn cho R sẽ ít hơn 3.4Gb bạn có. Trên Windows R 64 bit sẽ có thể sử dụng nhiều RAM hơn và lượng RAM tối đa bạn có thể lắp/cài đặt sẽ tăng lên.

Nếu điều đó là không thể, thì hãy xem xét một cách tiếp cận khác; có thể làm mô phỏng của bạn theo lô với n trên mỗi lô nhỏ hơn nhiều so với N. Bằng cách đó bạn có thể vẽ số mô phỏng nhỏ hơn nhiều, làm bất cứ điều gì bạn muốn, thu thập kết quả, sau đó lặp lại quá trình này cho đến khi bạn đã thực hiện đủ mô phỏng. Bạn không hiển thị những gì N là, nhưng tôi nghi ngờ nó là lớn, vì vậy hãy thử nhỏ hơn N một số lần để cung cấp cho bạn N trên tất cả.

+0

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

+4

@ 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. –

+0

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

2

gc() có thể giúp

dữ liệu tiết kiệm như .RData, đóng cửa, mở lại R, và tải các rdata thể giúp đỡ.

xem câu trả lời của tôi ở đây: https://stackoverflow.com/a/24754706/190791 để biết thêm chi tiết

11

tôi đã có cảnh báo tương tự bằng cách sử dụng gói raster.

> my_mask[my_mask[] != 1] <- NA 
Error: cannot allocate vector of size 5.4 Gb 

Giải pháp là thực sự đơn giản và bao gồm trong việc tăng dung lượng lưu trữ của R, đây dòng mã:

##To know the current storage capacity 
> memory.limit() 
[1] 8103 
## To increase the storage capacity 
> memory.limit(size=56000) 
[1] 56000  
## I did this to increase my storage capacity to 7GB 

Hy vọng rằng, điều này sẽ giúp bạn giải quyết vấn đề Cheers

+0

Tải ứng dụng này. 'Lỗi trong bộ nhớ.limit (size = 56000): không được ngớ ngẩn !: máy của bạn có giới hạn địa chỉ 4Gb ' –

+0

Dù sao, làm việc cho tôi! :) – juandelsur

+0

Tôi nghĩ rằng đó là vì RAM của bạn lớn hơn của tôi. –

0

sao R dừng bất kể giá trị N bạn sử dụng?cố gắng sử dụng các giá trị nhỏ và xem nếu đó là chức năng mvrnorm đó là vấn đề hoặc bạn chỉ có thể lặp nó trên các tập con. Chèn hàm gc() vào vòng lặp để giải phóng RAM liên tục

Các vấn đề liên quan