Hoe ruim ik R-geheugen op zonder mijn pc opnieuw op te starten?

Ik voer mijn code uit in R (onder Windows), wat veel gegevens in het geheugen met zich meebrengt. Ik heb geprobeerd rm(list=ls())te gebruiken om het geheugen op te schonen, maar het lijkt erop dat het geheugen nog steeds bezet is en ik kan mijn code niet opnieuw uitvoeren. Ik heb geprobeerd de R te sluiten en R opnieuw te starten, maar het is hetzelfde, het lijkt erop dat het geheugen nog steeds bezet is, want wanneer ik de codes uitvoer, staat er dat het geen geheugen kan toewijzen (maar de eerste keer wel). Het geheugen lijkt pas opgeruimd nadat ik mijn pc opnieuw heb opgestart.

Is er een manier om het geheugen op te schonen, zodat ik mijn code opnieuw kan uitvoeren zonder mijn pc elke keer opnieuw op te starten?


Antwoord 1, autoriteit 100%

Misschien kun je proberen de functie gc()te gebruiken. Een aanroep van gc()zorgt ervoor dat er een garbage collection plaatsvindt. Het kan handig zijn om gc()aan te roepen nadat een groot object is verwijderd, omdat dit R ertoe kan aanzetten geheugen terug te geven aan het besturingssysteem.
gc()retourneert ook een samenvatting van het bezette geheugen.


Antwoord 2, autoriteit 42%

Ik had hetzelfde probleem met R. Ik graaf een beetje en kom met een oplossing, dat we de R-sessie opnieuw moeten starten om het geheugen/RAM volledig op te schonen. Hiervoor kun je een simpele code gebruiken nadat je alles uit je werkruimte hebt verwijderd. de code is als volgt:

rm(list = ls())
.rs.restartR()

Antwoord 3, autoriteit 15%

Gebruik de functie ls()om te zien welke R-objecten ruimte innemen. gebruik rm(“objectName”) om de objecten uit het R-geheugen te wissen die niet langer nodig zijn. Zie ook dit.


Antwoord 4, autoriteit 7%

memory.size(max=T) # gives the amount of memory obtained by the OS
[1] 1800
memory.size(max=F) # gives the amount of memory being used
[1] 261.17

Met het voorbeeld van Paul,

m = matrix(runif(10e7), 10000, 1000)

Nu

memory.size(max=F)
[1] 1024.18

Om het geheugen op te ruimen

gc()
memory.size(max=F)
[1] 184.86

Met andere woorden, het geheugen zou nu weer leeg moeten zijn. Als je een code lus maakt, is het een goed idee om een gc()toe te voegen als de laatste regel van je lus, zodat het geheugen wordt gewist voordat de volgende iteratie begint.


Antwoord 5, autoriteit 4%

Een voorbeeld onder Linux (Fedora 16) laat zien dat geheugen vrijkomt wanneer R wordt gesloten:

$ free -m                                                                                                                                                                                                                                    
             total       used       free     shared    buffers     cached                                                                                                                                                                    
Mem:          3829       2854        974          0        344       1440                                                                                                                                                                    
-/+ buffers/cache:       1069       2759                                                                                                                                                                                                     
Swap:         4095         85       4010     

2854 megabyte wordt gebruikt. Vervolgens open ik een R-sessie en maak ik een grote matrix van willekeurige getallen:

m = matrix(runif(10e7), 10000, 1000)

wanneer de matrix wordt gemaakt, wordt 3714 MB gebruikt:

$ free -m                                                                                                                                                                                                                                    
             total       used       free     shared    buffers     cached                                                                                                                                                                    
Mem:          3829       3714        115          0        344       1442                                                                                                                                                                    
-/+ buffers/cache:       1927       1902                                                                                                                                                                                                     
Swap:         4095         85       4010     

Na het afsluiten van de R-sessie krijg ik netjes het geheugen terug dat ik gebruikte (2856 MB vrij):

$ free -m                                                                                                                                                                                                                                    
             total       used       free     shared    buffers     cached                                                                                                                                                                    
Mem:          3829       2856        972          0        344       1442                                                                                                                                                                    
-/+ buffers/cache:       1069       2759                                                                                                                                                                                                     
Swap:         4095         85       4010   

Natuurlijk gebruik je Windows, maar je zou deze oefening in Windows kunnen herhalen en rapporteren hoe het beschikbare geheugen zich ontwikkelt voor en nadat je deze grote dataset in R hebt gemaakt.


Antwoord 6, autoriteit 2%

Voeg dit toe ter referentie voor het geval iemand opnieuw moet opstarten en onmiddellijk een opdracht moet uitvoeren.

Ik gebruik deze aanpak alleen om RAM uit het systeem te wissen. Zorg ervoor dat u alle objecten hebt verwijderd die niet langer nodig zijn. Misschien kan gc()ook vooraf helpen. Maar niets zal RAM beter wissen als de R-sessie opnieuw starten.

library(rstudioapi)
restartSession(command = "print('x')")

Antwoord 7

Je kunt maar zoveel doen met rm() en gc(). Zoals gesuggereerd door Gavin Simpson, zelfs als je het eigenlijke geheugen in R vrijmaakt, zal Windows het vaak niet terugkrijgen totdat je R sluit of het nodig is omdat al het schijnbare Windows-geheugen vol raakt.

Dit is meestal geen probleem. Als u echter grote lussen uitvoert, kan dit op de lange termijn soms leiden tot gefragmenteerd geheugen, zodat zelfs als u het geheugen vrijmaakt en R opnieuw start, het gefragmenteerde geheugen u kan beletten grote hoeveelheden geheugen toe te wijzen. Vooral als andere applicaties gefragmenteerd geheugen toegewezen kregen terwijl je R. rm() en gc() draaide, kan het onvermijdelijke vertragen, maar meer RAM is beter.


Antwoord 8

Ik vond het handig om naar mijn “tmp”-map te gaan en alle hangende sessiebestanden te verwijderen. Dit maakt meestal alle geheugen vrij dat lijkt te zijn “vastgelopen”.

Other episodes