.NET 파일로 변환하려는 대용량 데이터 프레임 (몇 GB 정도)이 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
답변
이것은 v1.9.0 이상 에서 사용할 수 있습니다 . 에서 뉴스 :
o 이 SO post 다음에
setDT
,list
(named 및 / 또는 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*
이전 (현재 구식) 답변에 대한 기록을 참조하십시오.