将数据帧转换为data.table而不复制

 刘莉长 发布于 2023-02-13 12:05

我有一个大型数据框(大约几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

Arun.. 76

这可以从v1.9.0 +获得.来自新闻:

o在此SO帖子之后,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*

查看较早(现已过时)答案的历史记录.

1 个回答
  • 这可以从v1.9.0 +获得.来自新闻:

    o在此SO帖子之后,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*
    

    查看较早(现已过时)答案的历史记录.

    2023-02-13 12:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有