R geheugenbeheer / kan vector van grootte n Mb niet toewijzen

Ik loop tegen problemen aan bij het gebruik van grote objecten in R. Bijvoorbeeld:

> 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

Ik begrijp dat dit te maken heeft met de moeilijkheid om aaneengesloten geheugenblokken te verkrijgen (van hier):

Foutmeldingen die beginnen kunnen niet
vector van grootte toewijzen geven a . aan
het niet verkrijgen van geheugen, ofwel
omdat de maat groter was dan de
adresruimtelimiet voor een proces of,
waarschijnlijker, omdat het systeem was
kan het geheugen niet leveren. Opmerking
dat er op een 32-bits build misschien wel
voldoende vrij geheugen beschikbaar zijn, maar
niet een groot genoeg aaneengesloten blok van
adresruimte waarin het moet worden toegewezen.

Hoe kan ik dit omzeilen? Mijn grootste probleem is dat ik op een bepaald punt in mijn script kom en R kan geen 200-300 Mb toewijzen aan een object… Ik kan het blok niet echt vooraf toewijzen omdat ik het geheugen nodig heb voor andere verwerkingen. Dit gebeurt zelfs als ik ijverig onnodige objecten verwijder.

EDIT: Ja, sorry: 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

Antwoord 1, autoriteit 100%

Overweeg of je al deze gegevens echt expliciet nodig hebt, of mag de matrix schaars zijn? Er is goede ondersteuning in R (zie Matrixpakket voor bijv.) voor schaarse matrices.

Houd alle andere processen en objecten in R tot een minimum beperkt wanneer u objecten van deze grootte moet maken. Gebruik gc()om nu ongebruikt geheugen te wissen, of, beter maak alleen het object dat je nodig hebt in één sessie.

Als het bovenstaande niet helpt, koop dan een 64-bits machine met zoveel RAM als je je kunt veroorloven, en installeer 64-bits R.

Als u dat niet kunt, zijn er veel online services voor computergebruik op afstand.

Als je dat niet kunt doen, zullen de geheugentoewijzingstools zoals pakket ff(of bigmemoryzoals Sascha vermeldt) je helpen een nieuwe oplossing te bouwen. In mijn beperkte ervaring is ffhet meer geavanceerde pakket, maar je zou het onderwerp High Performance Computingover CRAN-taakweergaven moeten lezen.


Antwoord 2, autoriteit 68%

Voor Windows-gebruikers heeft het volgende me enorm geholpen om enkele geheugenbeperkingen te begrijpen:

  • voor het openen van R, open de Windows Resource Monitor (Ctrl-Alt-Delete / Start Taakbeheer / Performance-tab / klik op de onderste knop ‘Resource Monitor’ / Memory-tab)
  • je zult zien hoeveel RAM-geheugen we alhebben gebruikt voordat je R opent, en door welke applicaties. In mijn geval wordt 1,6 GB van de totale 4 GB gebruikt. Dus ik kan alleen 2,4 GB krijgen voor R, maar nu komt het erger…
  • Open R en maak een gegevensset van 1,5 GB en verlaag vervolgens de grootte tot 0,5 GB, de resourcemonitor laat zien dat mijn RAM op bijna 95% wordt gebruikt.
  • Gebruik gc()om Garbage Collection = & GT te doen; Het werkt, ik kan het geheugengebruik zien Ga naar 2 GB

Aanvullend advies dat op mijn machine werkt:

  • Maak de functies voor, sla op als een RDATA-bestand, sluit R, Open R opnieuw, en laad de treipfuncties. De Resource Manager toont typisch een lager geheugengebruik, wat betekent dat zelfs GC () niet alle mogelijke geheugen herstelt en sluit / opnieuw openen r werkt het beste om te beginnen met maximaal beschikbaar geheugen .
  • De andere truc is om alleen de trainingsset voor training te laden (niet laden de testset, die typisch de helft van de grootte van de treinstel kan zijn). De trainingsfase kan geheugen gebruiken tot het maximum (100%), dus alles beschikbaar is handig. Dit alles is om met een korrel zout te nemen, omdat ik experimenteer met R-geheugenlimieten.

Antwoord 3, Autoriteit 32%

Ik volgde naar de Help-pagina van memory.limiten ontdekte dat op mijn computer R standaard kan gebruiken tot ~ 1,5 GB RAM en dat de gebruiker deze limiet kan verhogen. De volgende code gebruiken,

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

hielp me om mijn probleem op te lossen.


Antwoord 4, Autoriteit 17%

Hier is een presentatie over dit onderwerp dat u misschien interessant vindt:

http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/

Ik heb de besproken dingen niet zelf geprobeerd, maar het pakket bigmemorylijkt erg handig


Antwoord 5, autoriteit 15%

De eenvoudigste manier om deze beperking te omzeilen, is door over te schakelen naar 64-bits R.


Antwoord 6, autoriteit 14%

Ik kwam een soortgelijk probleem tegen en ik gebruikte 2 flashdrives als ‘ReadyBoost’. De twee schijven gaven 8 GB extra geheugen (voor cache) en het loste het probleem op en verhoogde ook de snelheid van het systeem als geheel.
Om Readyboost te gebruiken, klikt u met de rechtermuisknop op de schijf, gaat u naar eigenschappen en selecteert u ‘ReadyBoost’ en selecteert u het keuzerondje ‘dit apparaat gebruiken’ en klikt u op toepassen of ok om te configureren.


Antwoord 7, autoriteit 9%

Als je je script in een linux-omgeving draait, kun je dit commando gebruiken:

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

en de server zal het gevraagde geheugen voor u toewijzen (volgens de serverlimieten, maar met een goede server – er kunnen grote bestanden worden gebruikt)


Antwoord 8, autoriteit 3%

Eén optie is voor en na het uitvoeren van uw opdracht die een hoog geheugenverbruik veroorzaakt om een “vuilnisverzameling” uit te voeren door de opdracht gc()uit te voeren, dit zal bovendien geheugen vrijmaken voor uw analyses om de opdracht memory.limit()te gebruiken.

Voorbeeld:

gc()
memory.limit(9999999999)
fit <-lm(Y ~ X)
gc() 

Antwoord 9, autoriteit 2%

De bovengenoemde methode voor opslaan/laden werkt voor mij. Ik weet niet zeker hoe/of gc()het geheugen defragmenteert, maar dit lijkt te werken.

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

Other episodes