codememo

복사하지 않고 데이터 프레임을 data.table로 변환

tipmemo 2023. 9. 10. 12:17
반응형

복사하지 않고 데이터 프레임을 data.table로 변환

대용량 데이터 프레임(수 GB 단위)을 사용하여 A로 변환하고자 합니다.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 이 S.O. 포스트를 따라서, 함수.setDT현재 구현된 것은 A.A.를 수행합니다.list(이름 있음 및/또는 이름 없음),data.frame(또는data.table)을 입력으로 하여 a와 동일한 객체를 반환합니다.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*

오래된(현재는 구식인) 답변은 기록을 참조하십시오.

언급URL : https://stackoverflow.com/questions/20345022/convert-a-data-frame-to-a-data-table-without-copy

반응형