Quản lý bộ nhớ R / không thể phân bổ vectơ kích thước n Mb


149

Tôi đang gặp vấn đề khi cố gắng sử dụng các đối tượng lớn trong R. Ví dụ:

> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for

Tôi hiểu rằng điều này có liên quan đến khó khăn trong việc có được các khối bộ nhớ liền kề (từ đây ):

Thông báo lỗi bắt đầu không thể phân bổ vectơ kích thước biểu thị lỗi không lấy được bộ nhớ, vì kích thước vượt quá giới hạn không gian địa chỉ cho một quy trình hoặc, nhiều khả năng, vì hệ thống không thể cung cấp bộ nhớ. Lưu ý rằng trên bản dựng 32 bit, có thể có đủ bộ nhớ trống, nhưng không phải là một khối không gian địa chỉ liền kề đủ lớn để ánh xạ nó.

Làm sao để tôi có được xung quanh này? Khó khăn chính của tôi là tôi đến một điểm nhất định trong kịch bản của mình và R không thể phân bổ 200-300 Mb cho một đối tượng ... Tôi thực sự không thể phân bổ trước khối vì tôi cần bộ nhớ để xử lý khác. Điều này xảy ra ngay cả khi tôi khéo léo loại bỏ các vật thể không cần thiết.

EDIT: Có, xin lỗi: Windows XP SP3, RAM 4Gb, R 2.12.0:

> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_Caribbean.1252  LC_CTYPE=English_Caribbean.1252   
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Caribbean.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

Cố gắng sử dụng 'miễn phí' để giải phóng bộ nhớ của quá trình khác không được sử dụng.
Manoel Galdino

5
@ Manoel Galdino: 'miễn phí' là gì? Hàm R?
Benjamin

3
@Manoel: Trong R, tác vụ giải phóng bộ nhớ được xử lý bởi trình thu gom rác chứ không phải người dùng. Nếu làm việc ở cấp độ C, người ta có thể thủ công CallocFreebộ nhớ, nhưng tôi nghi ngờ đây không phải là điều mà Benjamin đang làm.
Sharpie

Trong thư viện XML, bạn có thể sử dụng miễn phí. Từ tài liệu: "Hàm chung này có sẵn để giải phóng rõ ràng bộ nhớ được liên kết với đối tượng đã cho. Nó được sử dụng cho các đối tượng con trỏ bên ngoài không có chức năng / thói quen hoàn thiện tự động giúp dọn sạch bộ nhớ được sử dụng bởi đối tượng bản địa. "
Manoel Galdino

Câu trả lời:


78

Xem xét liệu bạn có thực sự cần tất cả dữ liệu này một cách rõ ràng, hoặc ma trận có thể thưa thớt không? Có hỗ trợ tốt trong R (xem Matrixgói ví dụ) cho ma trận thưa thớt.

Giữ tất cả các quá trình và đối tượng khác trong R ở mức tối thiểu khi bạn cần tạo các đối tượng có kích thước này. Sử dụng gc()để xóa bộ nhớ hiện không sử dụng hoặc tốt hơn là chỉ tạo đối tượng bạn cần trong một phiên .

Nếu những điều trên không thể giúp được, hãy lấy một máy 64 bit có nhiều RAM nhất có thể và cài đặt R. 64 bit.

Nếu bạn không thể làm điều đó, có nhiều dịch vụ trực tuyến cho máy tính từ xa.

Nếu bạn không thể làm điều đó, các công cụ ánh xạ bộ nhớ như gói ff(hoặc bigmemorynhư đề cập của Sascha) sẽ giúp bạn xây dựng một giải pháp mới. Theo kinh nghiệm hạn chế của tôi fflà gói nâng cao hơn, nhưng bạn nên đọc High Performance Computingchủ đề trên CRAN Nhiệm vụ xem.


1
nhiệm vụ là phân loại hình ảnh, với RandomForest. Tôi cần phải có một ma trận dữ liệu đào tạo (tối đa 60 băng tần) và bất cứ nơi nào từ 20.000 đến 6.000.000 hàng để cung cấp cho RandomForest. Hiện tại, tôi đạt tối đa khoảng 150.000 hàng vì tôi cần một khối liền kề để giữ đối tượng RandomForest kết quả ... Đó cũng là lý do tại sao bigmemory không giúp ích, vì RandomForest yêu cầu một đối tượng ma trận.
Benjamin

Ý bạn là gì khi "chỉ tạo đối tượng bạn cần trong một phiên"?
Benjamin

chỉ tạo 'a' một lần, nếu bạn hiểu sai lần đầu tiên bắt đầu một phiên mới
mdsumner

1
Tôi sẽ nói thêm rằng đối với các chương trình chứa các vòng lặp lớn, nơi thực hiện nhiều tính toán nhưng đầu ra tương đối nhỏ, việc gọi phần bên trong của vòng lặp thông qua Rupcript (từ BASH hoặc Python Script) có thể hiệu quả hơn về bộ nhớ và đối chiếu / tổng hợp các kết quả sau đó trong một tập lệnh khác. Bằng cách đó, bộ nhớ được giải phóng hoàn toàn sau mỗi lần lặp. Có một chút tính toán lãng phí từ việc tải lại / tính toán lại các biến được truyền vào vòng lặp, nhưng ít nhất bạn có thể giải quyết được vấn đề bộ nhớ.
Benjamin

54

Đối với người dùng Windows, những điều sau đây đã giúp tôi hiểu được một số hạn chế về bộ nhớ:

  • trước khi mở R, hãy mở Trình giám sát tài nguyên Windows (Ctrl-Alt-Delete / Khởi động Trình quản lý tác vụ / tab Hiệu suất / nhấp vào nút dưới cùng 'Trình giám sát tài nguyên' / tab Bộ nhớ)
  • bạn sẽ thấy bộ nhớ RAM chúng tôi đã sử dụng bao nhiêu trước khi bạn mở R và bằng ứng dụng nào. Trong trường hợp của tôi, 1,6 GB trong tổng số 4GB được sử dụng. Vì vậy, tôi sẽ chỉ có thể nhận được 2,4 GB cho R, nhưng bây giờ tệ hơn ...
  • mở R và tạo bộ dữ liệu 1,5 GB, sau đó giảm kích thước xuống 0,5 GB, Trình theo dõi tài nguyên cho thấy RAM của tôi được sử dụng ở mức gần 95%.
  • sử dụng gc()để thu gom rác => nó hoạt động, tôi có thể thấy bộ nhớ sử dụng giảm xuống còn 2 GB

nhập mô tả hình ảnh ở đây

Lời khuyên bổ sung hoạt động trên máy của tôi:

  • chuẩn bị các tính năng, lưu dưới dạng tệp RData, đóng R, mở lại R và tải các tính năng của tàu. Trình quản lý tài nguyên thường hiển thị mức sử dụng Bộ nhớ thấp hơn, có nghĩa là ngay cả gc () cũng không phục hồi tất cả bộ nhớ có thể và đóng / mở lại R hoạt động tốt nhất để bắt đầu với bộ nhớ tối đa khả dụng .
  • mẹo khác là chỉ tải bộ tàu để đào tạo (không tải bộ kiểm tra, thường có thể bằng một nửa kích thước của bộ tàu). Giai đoạn đào tạo có thể sử dụng bộ nhớ đến mức tối đa (100%), vì vậy mọi thứ có sẵn đều hữu ích. Tất cả điều này là để lấy một hạt muối khi tôi đang thử nghiệm giới hạn bộ nhớ R.

9
R tự mình thu gom rác, gc()chỉ là ảo ảnh. Kiểm tra Trình quản lý tác vụ chỉ là thao tác windows rất cơ bản. Lời khuyên duy nhất tôi có thể đồng ý là tiết kiệm ở định dạng .RData
David Arenburg

3
@DavidArenburg gc () là ảo ảnh? Điều đó có nghĩa là hình ảnh tôi có ở trên cho thấy việc giảm sử dụng bộ nhớ là một ảo ảnh. Tôi nghĩ bạn sai, nhưng tôi có thể nhầm.
Timothée HENRY

4
Tôi không có nghĩa là gc()không làm việc. Tôi chỉ có nghĩa là R thực hiện nó tự động, vì vậy bạn không cần phải làm thủ công. Xem tại đây
David Arenburg

2
@DavidArenburg Tôi có thể nói với bạn về một thực tế rằng việc giảm sử dụng bộ nhớ trong hình trên là do lệnh gc (). Tôi không tin tài liệu bạn trỏ đến là chính xác, ít nhất là không phải cho thiết lập của tôi (Windows, phiên bản R 3.1.0 (2014-04-10) Nền tảng: i386-w64-mingw32 / i386 (32-bit)).
Timothée HENRY

15
Ok, lần cuối cùng. gc() LÀM VIỆC . Bạn không cần phải sử dụng nó vì R thực hiện nó
David Arenburg


14

Cách đơn giản nhất để vượt qua giới hạn này là chuyển sang 64 bit R.


25
Nói chung, đó không phải là cách chữa trị - tôi đã chuyển đổi và bây giờ tôi đã Error: cannot allocate vector of size ... Gbthay thế (nhưng vâng, tôi có rất nhiều dữ liệu).
om-nom-nom

2
Có thể không phải là một phương pháp chữa trị nhưng nó giúp rất nhiều. Chỉ cần tải lên RAM và tiếp tục tăng bộ nhớ.limit (). Hoặc, có thể nghĩ về việc phân vùng / lấy mẫu dữ liệu của bạn.
Random_forest_fanatic

Nếu bạn gặp sự cố ngay cả trong 64 bit, về cơ bản là không giới hạn, có lẽ bạn đang cố gắng phân bổ thứ gì đó thực sự lớn. Bạn đã tính toán vector lớn như thế nào, theo lý thuyết? Mặt khác, máy tính của bạn cần nhiều RAM hơn, nhưng bạn chỉ có thể có rất nhiều.
hangmanwa7id

Rất vui được thử các giải pháp đơn giản như thế này trước các giải pháp chống tường khác. Cảm ơn.
Nova

Hơn nữa, đây không chỉ là vấn đề với Windows. Hiện tại tôi đang chạy trên Ubuntu, 64-bit R, sử dụng Ma trận và gặp khó khăn khi thao tác với đối tượng Ma trận 20048 x 96448.

12

Tôi đã gặp một vấn đề tương tự và tôi đã sử dụng 2 ổ đĩa flash là 'ReadyBoost'. Hai ổ đĩa đã tăng thêm 8GB bộ nhớ (cho bộ nhớ cache) và nó đã giải quyết vấn đề và cũng tăng tốc độ của toàn bộ hệ thống. Để sử dụng Readyboost, nhấp chuột phải vào ổ đĩa, đi đến thuộc tính và chọn 'ReadyBoost' và chọn 'sử dụng nút radio của thiết bị này và nhấp vào áp dụng hoặc ok để định cấu hình.


11

Tôi đã theo dõi trang trợ giúp của memor.limit và phát hiện ra rằng trên máy tính R của tôi theo mặc định có thể sử dụng tới ~ 1,5 GB RAM và người dùng có thể tăng giới hạn này. Sử dụng mã sau đây,

>memory.limit()
[1] 1535.875
> memory.limit(size=1800)

đã giúp tôi giải quyết vấn đề của mình.


1
Tại sao điều này được bỏ phiếu xuống? chắc chắn, đó là một cách tiếp cận nguy hiểm, nhưng nó thường có thể giúp ích nếu chỉ cần thêm một chút bộ nhớ cho phiên để nó hoạt động.
Jeppe Olsen

3
Đây chỉ là một giải pháp cụ thể cho cửa sổ
Kim Hoa Wang

9

Nếu bạn đang chạy tập lệnh của mình ở môi trường linux, bạn có thể sử dụng lệnh này:

bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"

và máy chủ sẽ phân bổ bộ nhớ được yêu cầu cho bạn (theo giới hạn của máy chủ, nhưng với máy chủ tốt - có thể sử dụng phương thức ôm)


1
Tôi có thể sử dụng điều này trên một ví dụ Amazon EC2 không? Nếu vậy, tôi phải thay server_namethế cái gì? Tôi đang gặp phải vấn đề này cannot allocate vector size...khi cố gắng thực hiện Ma trận thuật ngữ tài liệu khổng lồ trên AMI và tôi không thể hiểu tại sao nó không có đủ bộ nhớ, hoặc tôi cần thuê thêm bao nhiêu nữa. Cảm ơn bạn!
seth127

Tôi là người mới bắt đầu sử dụng Ubuntu và sử dụng Rstudio trên đó. Tôi có RAM 16 GB. Làm thế nào để tôi áp dụng quá trình bạn hiển thị trong câu trả lời. Cảm ơn
runjumpfly

3

Phương pháp lưu / tải được đề cập ở trên làm việc cho tôi. Tôi không chắc làm thế nào / nếu gc()chống phân mảnh bộ nhớ nhưng điều này dường như hoạt động.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.