2013-01-22 5 views
6

W R, próbuję łączyć i konwertować kilka zestawów danych czasu jako xts z http://www.truefx.com/?page=downloads jednak pliki są duże i istnieje wiele plików, więc to powoduje problemy na moim laptopie. Są one przechowywane jako plik csv, który został skompresowany jako plik zip.zwalnianie pamięci w R

Pobieranie i rozpakowywanie ich jest dość łatwe (chociaż zajmuje dużo miejsca na dysku twardym).

Ładowanie 350MB plików z danymi miesięcznymi do R jest dość proste dzięki nowej funkcji fread() w pakiecie data.table.

Dokonuje się pewnych transformacji danych (wewnątrz funkcji), dzięki czemu znaczniki czasowe można łatwo odczytać i wytwarza się środkową kolumnę. Następnie datatable jest zapisywany jako plik RData na dysku twardym, a wszystkie odniesienia do obiektu danych są usuwane z obszaru roboczego, a gc() jest uruchamiany po usunięciu ... jednak patrząc na sesję R w moim monitorze aktywności (uruchamiane z komputera Mac) ... nadal wygląda na to, że zajmuje prawie 1 GB pamięci RAM ... i rzeczy wydają się nieco opóźnione ... Miałem zamiar załadować kilka lat wartości plików csv w tym samym czasie, przekonwertować je do użytecznych datatables, połącz je, a następnie utwórz pojedynczy obiekt xts, który wydaje się niewykonalny, jeśli tylko jeden miesiąc wykorzystuje 1 GB pamięci RAM.

Wiem, że mogę sekwencyjnie pobierać każdy plik, konwertować go, zapisywać, wyłączać R i powtarzać, aż mam kilka plików RData, które mogę załadować i powiązać, ale miałem nadzieję, że może być skuteczniejszy sposób zrób to, aby po usunięciu wszystkich odwołań do datatable nie powróciło "normalne" lub na poziomie uruchamiania pamięci RAM. Czy istnieją lepsze sposoby czyszczenia pamięci niż gc()? Wszelkie sugestie będą bardzo mile widziane.

+1

Czy masz te same objawy, jeśli yo użyjesz 'read.csv' zamiast' fread'? – GSee

+1

Wydaje się być związane z http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command – redmode

+0

przy użyciu 'x <- read.csv (...) 'przywołuje użycie pamięci do 1.2GB, a następnie uruchamia' 'rm (x)', a następnie 'gc()', przenosi ją tylko do 894 MB ... wciąż nie w pobliżu oryginalnego ~ 75 MB pamięci RAM .. podczas uruchamiania/inicjowania R. –

Odpowiedz

6

W moim projekcie miałem do czynienia z wieloma dużymi plikami. Zorganizowałem procedurę na następujących zasadach:

  1. Izoluj żądane pamięci operacje w oddzielnych skryptach R.
  2. Uruchom każdy skrypt w nowym procesie, który jest niszczony po wykonaniu. W ten sposób system przywraca zużytą pamięć.
  3. Przesyłaj parametry do skryptów za pomocą pliku tekstowego.

Rozważ przykład zabawek poniżej.

generacja danych:

setwd("/path/to") 
write.table(matrix(1:5e7, ncol=10), "temp.csv") # 465.2 Mb file 

slave.R - pamięć zużywa część

setwd("/path/to") 
library(data.table) 

# simple processing 
f <- function(dt){ 
    dt <- dt[1:nrow(dt),] 
    dt[,new.row:=1] 
    return (dt) 
} 

# reads parameters from file 
csv <- read.table("io.csv") 
infile <- as.character(csv[1,1]) 
outfile <- as.character(csv[2,1]) 

# memory-hungry operations 
dt <- as.data.table(read.csv(infile)) 
dt <- f(dt) 
write.table(dt, outfile) 

master.R - wykonuje niewolników w oddzielnych procesach

setwd("/path/to") 

# 3 files processing 
for(i in 1:3){ 
    # sets iteration-specific parameters 
    csv <- c("temp.csv", paste("temp", i, ".csv", sep="")) 
    write.table(csv, "io.csv") 

    # executes slave process 
    system("R -f slave.R") 
} 
+0

+1 za wysiłek, ale że 'read.csv (infile)' nie używa 'colClasses', więc może to być głód pamięci z tego powodu i innych. Czy wypróbowałeś nową funkcję 'fread' w' data.table' v1.8.7 na R-Forge? Użytkownicy zgłaszają dzięki temu sukces. –

+0

@MatthewDowle: Tak, próbowałem 'fread' i znalazłem to niesamowite dla moich potrzeb. Ale AFAIK, obecny CRAN 'data.table' go nie ma? Więc postanowiłem umieścić tutaj _safe_ 'read.table' i' write.table'. – redmode

+0

@MatthewDowle: Co ważniejsze, @ h.l.m zgłosiło problem z pamięcią podczas używania 'fread'. To nie jest główny punkt mojej odpowiedzi. Podstawowym założeniem było uruchamianie zadań pamięciowych w oddzielnych procesach, aby zapewnić powrót pamięci. – redmode