Nov*_*rog 8 memory r large-data data.table
在得到2位绅士的帮助后,我设法从数据框+ plyr切换到数据表.
情况和我的问题
在我工作的时候,我注意到当我在我的数据集中添加1个新列时,峰值内存使用量几乎翻了一番,从3.5GB增加到6.8GB(根据Windows任务管理器),:=
包含~200K行乘2.5K列.
然后我尝试了25M col的200M行,增加了从6GB到7.6GB,之后下降到7.25GB gc()
.
特别是关于添加新列,Matt Dowle自己在这里提到:
使用:=运算符,您可以:
Run Code Online (Sandbox Code Playgroud)Add columns by reference Modify subsets of existing columns by reference, and by group by reference Delete columns by reference
这些操作都不会复制(可能很大的)data.table,甚至一次也不复制.
问题1:为什么要加入"NAS的一列的DT与2.5K列翻一番如果data.table完全不使用复制的峰值内存?
问题2:当DT为200M x 25时,为什么不会发生加倍?我没有为此包含版画屏幕,但可以随意更改我的代码并尝试.
使用测试代码的内存使用打印屏幕
清洁重启,RStudio和MS Word打开 - 使用103MB
Aft运行DT创建代码但在添加列之前 - 使用3.5GB
添加1列填充NA后,但在使用gc() - 6.8GB之前
运行gc()后 - 使用3.5GB
测试代码
为了调查,我做了以下测试代码,它们非常模仿我的数据集:
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?
Run Code Online (Sandbox Code Playgroud)
研究完成
我没有找到太多关于DT的内存使用情况的讨论,只有这一点,但即便如此,它并不是特别关于内存.
关于大型数据集+内存使用的大多数讨论涉及具有非常大的行数但相对较少的列的DT.
我的系统
Intel i7-4700采用4核/ 8线程; 16GB DDR3-12800内存; Windows 8.1 64位; 500GB 7200rpm硬盘; 64位R; 数据表版本1.9.4
免责声明
请原谅我使用'非R'方法(即任务管理器)来测量使用的内存.R中的内存测量/分析是我还没有想到的.
编辑1:更新到数据表ver 1.9.5并重新运行后.不幸的是,问题仍然存在.
(我不能相信,因为伟大的 DT 头脑(Arun)一直在研究这个问题,并发现它与 print.data.table 相关。只是为其他 SO 用户关闭循环。)
看来这个data.table
内存问题已经:=
在 R 版本 3.2 上得到解决,如下所示:
https: //github.com/Rdatatable/data.table/issues/1062
[引用来自 Github 第 1062 期的 @Arun...]
在 R v3.2、IIUC 中修复,此项目来自 NEWS:
当打印被分派到方法时,自动打印不再重复对象。
因此遇到此问题的其他人应该考虑升级到 R 3.2。
归档时间: |
|
查看次数: |
558 次 |
最近记录: |