2012-11-02 9 views
7

Używam funkcji blackboost z pakietu mboost do oszacowania modelu na około 500 MB danych w 64-bitowym 64-bitowym Windows 7-bitowym komputerze RAM. Podczas wykonywania R wykorzystuje praktycznie całą dostępną pamięć. Po wykonaniu obliczeń, ponad 4,5 gb zostaje przydzielone do R nawet po wywołaniu wywołania śmieci przy pomocy gc() lub zapisaniu i ponownym załadowaniu obszaru roboczego do nowej sesji R. Używając .ls.objects (1358003) Stwierdziłem, że rozmiar wszystkich widocznych obiektów wynosi około 550 MB.Jak usunąć niewidoczne obiekty z obszaru roboczego R, które nie są usuwane przez usuwanie śmieci?

Wyjście gc() mówi mi, że większość danych jest w komórkach wektor, choć nie jestem pewien, co to znaczy:

  used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 2856967 152.6 4418719 236.0 3933533 210.1 
Vcells 526859527 4019.7 610311178 4656.4 558577920 4261.7 

To, co robię:

> memory.size() 
[1] 1443.99 
> model <- blackboost(formula, data = mydata[mydata$var == 1,c(dv,ivs)],tree_control=ctree_control(maxdepth = 4)) 

... niektóre pakiety są ładowane ...

> memory.size() 
[1] 4431.85 
> print(object.size(model),units="Mb") 
25.7 Mb 
> memory.profile() 
    NULL  symbol pairlist  closure environment  promise language 
     1  15895  826659  20395  4234  13694  248423 
    special  builtin  char  logical  integer  double  complex 
     174  1572  1197774  34286  84631  42071   28 
character   ...   any  list expression bytecode externalptr 
    228592   1   0  79877   1  51276  2182 
    weakref   raw   S4 
     413   417  4385 

MYDATA [MYDATA $ var == 1, C (DV, IV)] zawiera 139593 wierszy i 75 Columa ns z większością zmiennych czynnikowych i pewnymi zmiennymi logicznymi lub liczbowymi. formuła jest obiektem formuły typu: "dv ~ var2 + var3 + .... + var73". dv to łańcuch nazw zmiennych i ivs to wektor łańcuchowy ze wszystkimi zmiennymi niezależnymi var2 ... var74.

Dlaczego tyle pamięci jest przydzielane do R? Jak mogę zwolnić R dodatkową pamięć? Wszelkie przemyślenia docenione!

+0

Co robi raport "memory.size()"? – James

+2

Może to być przeciek pamięci w kodzie. Czy możesz wkleić przykład funkcji, do której dzwonisz (z danymi demo)? – Spacedman

+0

Co dokładnie masz na myśli przez "wyciek pamięci"? Dodałem do mojego pytania przykładowy kod. Jeśli potrzebujesz więcej informacji, daj mi znać. @James: Dodałem funkcję memory.size() przed i po funkcji blackboost do mojego pytania. – Nima

Odpowiedz

2

Rozmawiałem z jednym z autorów pakietów, który powiedział mi, że wiele danych związanych z obiektem modelu jest zapisanych w środowiskach, co wyjaśnia, dlaczego object.size nie odzwierciedla pełnego wykorzystania pamięci R wywołanego przez funkcja blackboost. Powiedział mi również, że pakiet mboost nie został zoptymalizowany pod względem szybkości i wydajności pamięci, ale ma na celu elastyczność, a wszystkie drzewa są zapisywane, a tym samym również dane, co wyjaśnia duże ilości generowanych danych (wciąż znajduję wymiary godne uwagi ..). Zalecił użycie pakietu gbm (którego nie mogłem uzyskać, aby powtórzyć swoje wyniki, jeszcze) lub serializacji, wykonując coś takiego:

### first M_1 iterations 
mod <- blackboost(...)[M_1] 
f1 <- fitted(mod) 
rm(mod) 
### then M_2 additional iterations ... 
mod <- blackboost(..., offset = f1)[M_2] 
0

Z tego, co mogę zebrać, to nie gc() w R jest problemem, ale fakt, że pamięć nie w pełni wraca do systemu operacyjnego.

This thread nie zapewnia odpowiedzi, ale rzuca światło na naturę problemu.

Powiązane problemy