webentwicklung-frage-antwort-db.com.de

Speicherzuordnung "Fehler: Vektor der Größe 75,1 MB kann nicht zugewiesen werden"

Im Zuge der Vektorisierung von Simulationscode bin ich auf ein Speicherproblem gestoßen. Ich verwende 32-Bit-R-Version 2.15.0 (über RStudio-Version 0.96.122) unter Windows XP. Mein Computer verfügt über 3,46 GB RAM.

> 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

Hier ist ein minimales Beispiel für das Problem:

> 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

(In meiner Anwendung ist die Kovarianzmatrix Sigma nicht diagonal, aber ich bekomme in beiden Fällen denselben Fehler.) 

Ich habe den Nachmittag damit verbracht, über Speicherbelegungsprobleme in R zu lesen (einschließlich hier , hier und hier ). Nach dem, was ich gelesen habe, habe ich den Eindruck, dass es sich nicht um die verfügbaren RAM per se handelt, sondern um den verfügbaren fortlaufenden Adressraum. Dennoch scheint mir 75,1 MB ziemlich klein zu sein.

Ich würde mich sehr über Ihre Gedanken oder Vorschläge freuen. 

30
inhuretnakht

R ist an einen Punkt gelangt, an dem das Betriebssystem es nicht zuordnen kann ein anderes 75,1 MB RAM. Dies ist die Größe des Speicherblocks, der für den nächsten Teilvorgang erforderlich ist. Es ist keine Aussage über die Menge an zusammenhängendem RAM, die erforderlich ist, um den gesamten Vorgang abzuschließen. Zu diesem Zeitpunkt sind alle verfügbaren RAM erschöpft, aber Sie benötigen mehr Speicher, um fortzufahren, und das Betriebssystem kann nicht mehr RAM für R zur Verfügung stellen.

Mögliche Lösungen hierfür sind vielfältig. Das Offensichtliche ist, eine 64-Bit-Maschine mit mehr RAM zu besorgen. Ich habe die Details außer IIRC unter 32-Bit-Windows vergessen, jeder einzelne Prozess kann nur eine begrenzte Anzahl von RAM (2 GB?) Verwenden und unabhängig davon, dass Windows einen Teil des Speichers für sich behält, so dass RAM für R verfügbar ist etwas weniger als die 3,4 GB, die Sie haben. Auf 64-Bit-Windows R kann mehr RAM verwendet werden, und die maximale Anzahl von RAM, die Sie einbauen/installieren können, wird erhöht.

Wenn dies nicht möglich ist, sollten Sie einen alternativen Ansatz in Betracht ziehen. Vielleicht führen Sie Ihre Simulationen in Batches durch, wobei n pro Charge viel kleiner als N ist. Auf diese Weise können Sie eine viel geringere Anzahl von Simulationen zeichnen, tun, was Sie möchten, Ergebnisse sammeln und diesen Vorgang wiederholen, bis Sie ausreichend Simulationen durchgeführt haben. Sie zeigen nicht, was N ist, aber ich vermute, dass es groß ist. Versuchen Sie also, kleinere N einige Male zu verwenden, um Ihnen N alles zu geben.

29
Gavin Simpson

Ich hatte dieselbe Warnung mit dem Rasterpaket.

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

Die Lösung ist wirklich einfach und besteht in der Erhöhung der Speicherkapazität von R, hier der Codezeile:

##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

Hoffentlich hilft dies Ihnen, das Problem zu lösen

31
juandelsur

gc() kann helfen

speichern von Daten als .RData, Schließen, erneutes Öffnen von R und Laden der RData können Abhilfe schaffen.

siehe meine Antwort hier: https://stackoverflow.com/a/24754706/190791 für weitere Details

2
tucson

hört R auf, egal welchen N-Wert Sie verwenden? Versuchen Sie, kleine Werte zu verwenden, und prüfen Sie, ob die mvrnorm-Funktion das Problem ist, oder Sie können es einfach in Subsets schleifen. Fügen Sie die Funktion gc() in die Schleife ein, um einige RAM kontinuierlich freizugeben

0
Gabriel123