data.table
に変換したい(数GBのオーダーの)大きなデータフレームがあります。 as.data.table
を使用すると、データフレームのコピーが作成されます。つまり、データのサイズの少なくとも2倍の空きメモリが必要です。コピーなしで変換を行う方法はありますか?
以下に簡単な例を示します。
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 + から入手できます。 [〜#〜] news [〜#〜] から:
o このSOポスト に続いて、
setDT
(名前付きおよび/または名前なし)、data.frame
(またはdata.table
)を入力として受け取り、同じを返す関数list
が実装されました。参照による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*
古い(現在は古くなった)回答の履歴を参照してください。