1. ホーム
  2. r

[解決済み] データフレームをコピーせずにdata.tableに変換する

2023-07-06 15:40:25

質問

大きなデータフレーム(数GB程度)があり、これを data.table . 使用方法 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+ . より ニュース :

<ブロッククオート

o以下 このS.O.投稿 は、関数 setDT を受け取る関数が実装されました。 list (名前付きおよび/または名前なし)を取るようになりました。 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*


古い(現在は古い)回答は履歴を参照してください。