복사없이 데이터 프레임을 data.table로 변환


81

.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

답변:


93

이것은 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*

이전 (현재 구식) 답변에 대한 기록을 참조하십시오.


@Arun : 자세한 답변을 주셔서 감사합니다. 실제로 데이터 프레임을 data.table로 변환하는 방법을 묻고 있었지만 장난감 예제를 만드는 데 부주의했기 때문에 질문을 업데이트하여 데이터 프레임으로 만들겠습니다. 데이터 프레임에 대해 동일한 아이디어가 작동할까요? 예를 들어 데이터 프레임에 이미 이러한 setattr이 있고 나머지는 유지하기 때문에 처음 두 setattr을 제거 할 수 있습니까?
ytsaig 2013

@YT, "data.frame"을 "data.table"로 가져 오는 것을 의미한다면 물론 당신이 말하는 것은 옳습니다. data.frame 목록을 의미하는 경우 클래스를 설정하고 할당하기 전에 먼저 바인딩 (열 또는 행)해야합니다.
Arun

@Arun, 나는 data.table에 대한 단일 데이터 프레임 인 전자를 의미했으며, 더 잘 반영하기 위해 질문을 편집했습니다. 현명한 해결책에 다시 한 번 감사드립니다. 답변을있는 그대로 받아들이거나 수정 된 질문과 일치하도록 수정하려면 기다릴 수 있습니다.
ytsaig 2013

2
아마도 Matthew 의이 게시물truelength.
Arun

3
@eddi R2.14.0 이전 truelength에는 R의 벡터 헤더의 멤버가 R에 의해 초기화되지 않았습니다. C에서 변수를 초기화하지 않으면 정의되지 않은 내용이 있습니다 (이전에 해당 RAM 청크에 있었던 일). data.table()유사한 제작자는 R 2.14.0 이전과의 호환성을 truelength요청하기 전에 0으로 초기화 합니다 alloc.col. alloc.col보이는 truelength입력 (0 평균 truelength == 길이로 이동된다)한다. 언젠가는 data.table이이 때문에 R> = 2.14.0에 의존해야한다고 생각했지만 R> = 2.12.0을 유지할 수있었습니다. CRAN에 릴리스되기 전에 R2.12.0으로 테스트합니다.
Matt Dowle 2013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.