Manajemen memori R / tidak dapat mengalokasikan vektor ukuran n Mb

149

Saya mengalami masalah saat mencoba menggunakan objek besar di R. Misalnya:

> 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

Saya mengerti bahwa ini terkait dengan kesulitan mendapatkan blok memori yang berdekatan (dari sini ):

Pesan kesalahan yang dimulai tidak dapat mengalokasikan vektor ukuran menunjukkan kegagalan untuk mendapatkan memori, baik karena ukurannya melebihi batas ruang alamat untuk suatu proses atau, lebih mungkin, karena sistem tidak dapat menyediakan memori. Perhatikan bahwa pada build 32-bit mungkin ada cukup memori bebas yang tersedia, tetapi tidak cukup besar ruang alamat yang berdekatan untuk memetakannya.

Bagaimana saya bisa mengatasi ini? Kesulitan utama saya adalah bahwa saya sampai pada titik tertentu dalam skrip saya dan R tidak dapat mengalokasikan 200-300 Mb untuk sebuah objek ... Saya tidak dapat benar-benar mengalokasikan blok karena saya membutuhkan memori untuk pemrosesan lainnya. Ini terjadi bahkan ketika saya dengan rajin menghapus objek yang tidak dibutuhkan.

EDIT: Ya, maaf: Windows XP SP3, 4Gb RAM, 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
Benjamin
sumber
Cobalah untuk menggunakan 'bebas' untuk menghilangkan memori dari proses lain yang tidak digunakan.
Manoel Galdino
5
@ Manoel Galdino: Apa itu 'gratis'? Fungsi R?
Benjamin
3
@ Martin: Di R, tugas membebaskan memori ditangani oleh pengumpul sampah, bukan pengguna. Jika bekerja pada level C, seseorang dapat secara manual Callocdan Freememori, tetapi saya menduga ini bukan apa yang Benjamin lakukan.
Sharpie
Di perpustakaan XML Anda dapat menggunakan gratis. Dari dokumentasi: "Fungsi generik ini tersedia untuk secara eksplisit melepaskan memori yang terkait dengan objek yang diberikan. Ini dimaksudkan untuk digunakan pada objek pointer eksternal yang tidak memiliki fungsi finalizer otomatis / rutin yang membersihkan memori yang digunakan oleh objek asli. "
Manoel Galdino

Jawaban:

78

Pertimbangkan apakah Anda benar-benar membutuhkan semua data ini secara eksplisit, atau bisakah matriksnya jarang? Ada dukungan yang baik di R (lihat Matrixpaket untuk misalnya) untuk matriks jarang.

Simpan semua proses dan objek lainnya dalam R seminimal mungkin saat Anda perlu membuat objek dengan ukuran ini. Gunakan gc()untuk menghapus memori yang tidak digunakan sekarang, atau, lebih baik hanya membuat objek yang Anda butuhkan dalam satu sesi .

Jika hal di atas tidak dapat membantu, dapatkan mesin 64-bit dengan RAM sebanyak yang Anda mampu, dan instal 64-bit R.

Jika Anda tidak dapat melakukan itu, ada banyak layanan online untuk komputasi jarak jauh.

Jika Anda tidak dapat melakukannya, alat pemetaan memori seperti paket ff(atau bigmemoryseperti yang disebutkan Sascha) akan membantu Anda membangun solusi baru. Dalam pengalaman saya yang terbatas ffadalah paket yang lebih maju, tetapi Anda harus membaca High Performance Computingtopik tentang CRAN Task Views.

mdsumner
sumber
1
tugasnya adalah klasifikasi gambar, dengan randomForest. Saya perlu memiliki matriks data pelatihan (hingga 60 band) dan di mana saja dari 20.000 hingga 6.000.000 baris untuk diumpankan ke randomForest. Saat ini, saya maks sekitar 150.000 baris karena saya memerlukan blok yang berdekatan untuk menahan objek randomForest yang dihasilkan ... Yang juga mengapa bigmemory tidak membantu, karena randomForest membutuhkan objek matriks.
Benjamin
Apa yang Anda maksud dengan "hanya membuat objek yang Anda butuhkan dalam satu sesi"?
Benjamin
hanya buat 'a' sekali, jika Anda salah pertama kali memulai sesi baru
mdsumner
1
Saya akan menambahkan bahwa untuk program-program yang berisi loop besar di mana banyak perhitungan dilakukan tetapi outputnya relatif kecil, itu bisa menjadi lebih efisien-memori untuk memanggil bagian dalam loop melalui Rscript (dari BASH atau Python Script) , dan susun / agregat hasilnya setelah itu dalam skrip yang berbeda. Dengan begitu, memori benar-benar dibebaskan setelah setiap iterasi. Ada sedikit perhitungan yang terbuang dari memuat ulang / menghitung ulang variabel yang diteruskan ke loop, tetapi setidaknya Anda bisa menyelesaikan masalah memori.
Benjamin
54

Untuk pengguna Windows, berikut ini banyak membantu saya untuk memahami beberapa keterbatasan memori:

  • sebelum membuka R, buka Windows Resource Monitor (Ctrl-Alt-Delete / Start Task Manager / Performance tab / klik tombol bawah 'Resource Monitor' / Memory tab)
  • Anda akan melihat berapa banyak memori RAM yang telah kami gunakan sebelum Anda membuka R, dan dengan aplikasi mana. Dalam kasus saya, 1,6 GB dari total 4GB digunakan. Jadi saya hanya akan bisa mendapatkan 2,4 GB untuk R, tapi sekarang menjadi lebih buruk ...
  • buka R dan buat kumpulan data 1,5 GB, lalu kurangi ukurannya menjadi 0,5 GB, Resource Monitor menunjukkan RAM saya digunakan hampir 95%.
  • gunakan gc()untuk melakukan pengumpulan sampah => itu bekerja, saya bisa melihat penggunaan memori turun ke 2 GB

masukkan deskripsi gambar di sini

Saran tambahan yang berfungsi pada mesin saya:

  • menyiapkan fitur, simpan sebagai file RData, tutup R, buka kembali R, dan muat fitur kereta. Manajer Sumber Daya biasanya menunjukkan penggunaan Memori yang lebih rendah, yang berarti bahwa bahkan gc () tidak memulihkan semua memori yang mungkin dan menutup / membuka kembali R berfungsi paling baik untuk memulai dengan memori maksimum yang tersedia .
  • trik lainnya adalah dengan hanya memuat set kereta untuk pelatihan (jangan memuat set tes, yang biasanya bisa setengah dari set kereta). Fase pelatihan dapat menggunakan memori secara maksimal (100%), sehingga apa pun yang tersedia bermanfaat. Semua ini untuk mengambil dengan sebutir garam saat saya bereksperimen dengan batas memori R.
Timothée HENRY
sumber
9
R melakukan pengumpulan sampah sendiri, gc()hanya ilusi. Memeriksa Task manager hanyalah operasi windows yang sangat mendasar. Satu-satunya saran yang bisa saya setujui adalah menabung dalam format .Rata
David Arenburg
3
@ Davidviden gc () adalah ilusi? Itu berarti gambar yang saya miliki di atas menunjukkan setetes penggunaan memori adalah ilusi. Saya pikir Anda salah, tetapi saya mungkin salah.
Timothée HENRY
4
Maksud saya itu gc()tidak berhasil. Maksud saya R melakukannya secara otomatis, jadi Anda tidak perlu melakukannya secara manual. Lihat di sini
David Arenburg
2
@ DavidVenburg Saya dapat memberitahu Anda untuk fakta bahwa penurunan penggunaan memori pada gambar di atas adalah karena perintah gc (). Saya tidak percaya bahwa dokumen yang Anda tunjuk benar, setidaknya tidak untuk pengaturan saya (Windows, R versi 3.1.0 (2014-04-10) Platform: i386-w64-mingw32 / i386 (32-bit)).
Timothée HENRY
15
Ok, untuk yang terakhir kalinya. gc() APAKAH berhasil. Anda tidak perlu menggunakannya karena R melakukannya secara internal
David Arenburg
14

Cara paling sederhana untuk menghindari batasan ini adalah beralih ke 64 bit R.

David Heffernan
sumber
25
Itu bukan obat secara umum - Saya sudah beralih, dan sekarang saya sudah Error: cannot allocate vector of size ... Gbgantinya (tapi ya, saya punya banyak data).
om-nom-nom
2
Mungkin bukan obat tetapi banyak membantu. Cukup muat di RAM dan terus cranking memory.limit (). Atau, mungkin pikirkan tentang mempartisi / mengambil sampel data Anda.
random_forest_fanatic
Jika Anda mengalami masalah bahkan dalam 64-bit, yang pada dasarnya tidak terbatas, mungkin lebih dari itu Anda mencoba mengalokasikan sesuatu yang sangat besar. Sudahkah Anda menghitung seberapa besar vektor seharusnya, secara teoritis? Kalau tidak, bisa jadi komputer Anda membutuhkan lebih banyak RAM, tetapi hanya ada begitu banyak yang dapat Anda miliki.
hangmanwa7id
senang mencoba solusi sederhana seperti ini sebelum lebih banyak solusi yang bertentangan. Terima kasih.
Nova
Selain itu, ini tidak hanya masalah dengan Windows. Saya berjalan di Ubuntu saat ini, 64-bit R, menggunakan Matrix, dan mengalami kesulitan memanipulasi objek Matrix 20048 x 96448.
12

Saya mengalami masalah yang sama, dan saya menggunakan 2 flash drive sebagai 'ReadyBoost'. Kedua drive memberikan tambahan memori 8GB (untuk cache) dan itu memecahkan masalah dan juga meningkatkan kecepatan sistem secara keseluruhan. Untuk menggunakan Readyboost, klik kanan pada drive, pergi ke properti dan pilih 'ReadyBoost' dan pilih tombol radio 'gunakan perangkat ini' dan klik berlaku atau ok untuk mengkonfigurasi.

Kwaku Damoah
sumber
11

Saya mengikuti halaman bantuan dari memor.limit dan menemukan bahwa di komputer saya R secara default dapat menggunakan hingga ~ 1,5 GB RAM dan bahwa pengguna dapat meningkatkan batas ini. Menggunakan kode berikut,

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

membantu saya untuk menyelesaikan masalah saya.

Rajib Kumar De
sumber
1
Mengapa ini ditolak? tentu, ini pendekatan yang berbahaya, tetapi sering dapat membantu jika hanya sedikit lebih banyak memori yang perlu dialokasikan untuk sesi agar bisa berfungsi.
Jeppe Olsen
3
Ini hanya solusi khusus windows
Jinhua Wang
9

Jika Anda menjalankan skrip di lingkungan linux, Anda dapat menggunakan perintah ini:

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

dan server akan mengalokasikan memori yang diminta untuk Anda (sesuai dengan batas server, tetapi dengan server yang baik - hugefile dapat digunakan)

perawat
sumber
1
Bisakah saya menggunakan ini pada instance Amazon EC2? Jika demikian, apa yang harus saya lakukan server_name? Saya mengalami ini cannot allocate vector size...dengan mencoba melakukan Document-Term Matrix besar pada AMI dan saya tidak tahu mengapa itu tidak memiliki cukup memori, atau berapa banyak lagi yang harus saya sewa. Terima kasih!
seth127
Saya pemula Ubuntu dan menggunakan Rstudio di atasnya. Saya memiliki 16 GB RAM. Bagaimana saya menerapkan proses yang Anda tunjukkan dalam jawaban. Terima kasih
runjumpfly
3

Metode simpan / muat yang disebutkan di atas berfungsi untuk saya. Saya tidak yakin bagaimana / jika gc()defrag memori tetapi tampaknya ini berfungsi.

# defrag memory 
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
Simon Woodward
sumber