gpt4 book ai didi

R - 为什么向数据表添加 1 列几乎会使使用的峰值内存增加一倍?

转载 作者:IT王子 更新时间:2023-10-28 23:36:18 28 4
gpt4 key购买 nike

得到help后两位好心人,我设法从数据框+plyr切换到数据表。

情况和我的问题

随着我的工作,我注意到当我使用 := 添加 1 个新列时,内存使用峰值几乎翻了一番,从 3.5GB 增加到 6.8GB(根据 Windows 任务管理器) 到我的数据集,其中包含约 200K 行乘 2.5K 列。

然后我尝试了 200M 行乘 25 列,增加了从 6GB 到 7.6GB,然后在 gc() 之后下降到 7.25GB。

特别是关于添加新列,Matt Dowle 自己提到了 here那:

With its := operator you can :

Add columns by reference
Modify subsets of existing columns by reference, and by group by reference
Delete columns by reference

None of these operations copy the (potentially large) data.table at all, not even once.

问题 1:如果根本不复制 data.table,为什么要为具有 2.5K 列的 DT 添加单列“NAs”加倍使用的峰值内存?

问题2:为什么DT为200M x 25时不会发生翻倍?我没有为此包含打印屏幕,但请随时更改我的代码并尝试。

使用测试代码打印内存使用情况

  1. 干净重启,打开 RStudio 和 MS Word - 已使用 103MB 1. Clean re-boot, RStudio & MS Word opened

  2. 在运行 DT 创建代码之后但在添加列之前 - 使用了 3.5GB enter image description here

  3. 在添加 1 列填充 NA 之后,但在 gc() 之前 - 使用了 6.8GB enter image description here

  4. 运行 gc() 后 - 使用了 3.5GB enter image description here

测试代码

为了进行调查,我编写了以下与我的数据集非常相似的测试代码:

library(data.table)
set.seed(1)

# Credit: Dirk Eddelbuettel's answer in
# https://stackoverflow.com/questions/14720983/efficiently-generate-a-random-sample-of-times-and-dates-between-two-dates
RandDate <- function(N, st="2000/01/01", et="2014/12/31") {
st <- as.POSIXct(as.Date(st))
et <- as.POSIXct(as.Date(et))
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- runif(N, 0, dt)
rt <- as.character( strptime(st + ev, "%Y-%m-%d") )
}

# Create Sample data
TotalNoCol <- 2500
TotalCharCol <- 3
TotalDateCol <- 1
TotalIntCol <- 600
TotalNumCol <- TotalNoCol - TotalCharCol - TotalDateCol - TotalIntCol
nrow <- 200000

ColNames = paste0("C", 1:TotalNoCol)

dt <- as.data.table( setNames( c(

replicate( TotalCharCol, sample( state.name, nrow, replace = T ), simplify = F ),
replicate( TotalDateCol, RandDate( nrow ), simplify = F ),
replicate( TotalNumCol, round( runif( nrow, 1, 30 ), 2), simplify = F ),
replicate( TotalIntCol, sample( 1:10, nrow, replace = T ), simplify = F ) ),

ColNames ) )

gc()

# Add New columns, to be run separately
dt[, New_Col := NA ] # Additional col; uses excessive memory?

研究完成

我没有发现太多关于列多的 DT 的内存使用的讨论,只有 this但即便如此,它也不是专门针对内存的。

关于大型数据集 + 内存使用的大多数讨论都涉及行数非常大但列相对较少的 DT。

我的系统

Intel i7-4700 4 核/8 线程; 16GB DDR3-12800 内存; Windows 8.1 64 位; 500GB 7200rpm 硬盘; 64 位 R;数据表ver 1.9.4

免责声明

请原谅我使用“非 R”方法(即任务管理器)来测量使用的内存。 R 中的内存测量/分析是我还没有弄清楚的东西。


编辑 1:更新到数据表 1.9.5 版并重新运行后。不幸的是,问题仍然存在。

enter image description here

最佳答案

(我不能相信伟大的 DT 头脑(Arun)一直在研究这个问题,发现它与 print.data.table 有关。只是在这里为其他 SO 用户关闭循环。)

似乎 := 的这个 data.table 内存问题已在 R 版本 3.2 上得到解决,如下所述: https://github.com/Rdatatable/data.table/issues/1062

[引用 Github 问题 1062 中的 @Arun ...]

fixed in R v3.2, IIUC, with this item from NEWS:

Auto-printing no longer duplicates objects when printing is dispatched to a method.

所以其他有这个问题的人应该考虑升级到 R 3.2。

关于R - 为什么向数据表添加 1 列几乎会使使用的峰值内存增加一倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28347305/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com