Mam dużą ramkę danych (rzędu kilku GB), którą chciałbym przekonwertować na plik data.table
. Użycie as.data.table
tworzy kopię ramki danych, co oznacza, że potrzebuję dostępnej pamięci co najmniej dwukrotnie większej niż dane. Czy istnieje sposób na wykonanie konwersji bez kopii?
Oto prosty przykład do zademonstrowania:
library(data.table)
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))
gc(reset=TRUE)
tracemem(data)
data <- as.data.table(data)
gc()
Z wyjściem:
library(data.table)
# data.table 1.8.10 For help type: help("data.table")
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))
gc(reset=TRUE)
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 303759 16.3 597831 32.0 303759 16.3
# Vcells 100442572 766.4 402928632 3074.2 100442572 766.4
tracemem(data)
# [1] "<0x363fda0>"
data <- as.data.table(data)
# tracemem[0x363fda0 -> 0x31e4260]: copy as.data.table.data.frame as.data.table
gc()
# used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 304519 16.3 597831 32.0 306162 16.4
# Vcells 100444242 766.4 322342905 2459.3 200933219 1533.0
źródło
truelength
.truelength
element nagłówka wektora R nie został zainicjowany przez R. W C, jeśli nie zainicjujesz zmiennej, ma ona niezdefiniowaną zawartość (cokolwiek znajdowało się w tym fragmencie pamięci RAM wcześniej).data.table()
i podobni twórcy inicjują wartośćtruelength
0 przed wywołaniemalloc.col
zgodności z wersją wcześniejszą niż R 2.14.0.alloc.col
wyglądatruelength
jak dane wejściowe (0 oznacza prawdziwą długość == długość). W pewnym momencie pomyślałem, że data.table będzie musiała z tego powodu zależeć od R> = 2.14.0, ale udało mi się zachować R> = 2.12.0. Testuję z R2.12.0 przed każdą wersją do CRAN.