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 Matrix
pakket 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 bigmemory
zoals Sascha vermeldt) je helpen een nieuwe oplossing te bouwen. In mijn beperkte ervaring is ff
het meer geavanceerde pakket, maar je zou het onderwerp High Performance Computing
over 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.limit
en 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 bigmemory
lijkt 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")