Преобразование фрейма данных в данные.таблица без копии
у меня есть большой фрейм данных (в порядке нескольких ГБ), который я хотел бы преобразовать в data.table
. Используя as.data.table
создает копию фрейма данных, что означает, что мне нужна доступная память, чтобы быть по крайней мере в два раза больше данных. Есть ли способ сделать преобразование без копии?
вот простой пример для демонстрации:
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()
С выход:
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
1 ответ:
o следование этот С. О. в должности, функция
setDT
теперь реализовано, что принимаетlist
(по имени и/или unnamed),data.frame
(илиdata.table
) в качестве входных данных и возвращает тот же самый объект какdata.table
по ссылке (без копирования). Смотрите?setDT
примеры для более.в соответствии с
data.table
соглашение об именах-всеset*
функции изменяются по ссылке.:=
является единственным другим, который также изменяется по ссылке.require(data.table) # v1.9.0+ setDT(data) # converts data which is a data.frame to data.table *by reference*
см. историю для более старых (теперь устаревших) ответов.