我使用普利尔吗?我好像在用太多的记忆

ste*_*ejb 9 r plyr data.table

我有以下,有点大的数据集:

 > dim(dset)
 [1] 422105     25
 > class(dset)
 [1] "data.frame"
 > 
Run Code Online (Sandbox Code Playgroud)

没有做任何事情,R进程似乎需要大约1GB的RAM.

我试图运行以下代码:

  dset <- ddply(dset, .(tic), transform,
                date.min <- min(date),
                date.max <- max(date),
                daterange <- max(date) - min(date),
                .parallel = TRUE)
Run Code Online (Sandbox Code Playgroud)

运行该代码,RAM使用量猛增.它完全饱和了60GB的RAM,运行在32核机器上.我究竟做错了什么?

jor*_*ran 12

如果性能是一个问题,那么切换到使用data.table同名包中的s 可能是个好主意.他们很快.你会做一些大致相当的事情:

library(data.table)
dat <- data.frame(x = runif(100),
                  dt = seq.Date(as.Date('2010-01-01'),as.Date('2011-01-01'),length.out = 100),
                  grp = rep(letters[1:4],each = 25))

dt <- as.data.table(dat)
key(dt) <- "grp"

dt[,mutate(.SD,date.min = min(dt),
               date.max = max(dt),
               daterange = max(dt) - min(dt)), by = grp]
Run Code Online (Sandbox Code Playgroud)

  • +1 - 我会秒.我只是在一个`plyr`和一个稍微不同的`data.table`解决方案上做了时间,其中有30000个`tic`.`ddply`花了247.80秒到`data.table`的3.75秒.此外,`data.table`还被设计为使用更少的内存,实现pass-by-reference而不是data.frames的内存消耗pass-by-value. (2认同)

Jos*_*ien 10

这是data.table该问题的另一种应用,说明它是多么快速.(注意:这是使用dset,data.frame由Brian Diggs在他的回答中构建,除了30000而不是10个级别tic).

(究其原因,这是比@ joran的解决方案更快,是它避免使用.SD,而不是使用列直接,风格是不是有点不同plyr,但通常买巨大的速度起坐.再如,看到data.table维基哪些:(a)将其作为建议#1包括在内;以及(b)表示丢弃的代码的50倍加速.SD.

library(data.table)
system.time({
    dt <- data.table(dset, key="tic")
    # Summarize by groups and store results in a summary data.table
    sumdt <- dt[ ,list(min.date=min(date), max.date=max(date)), by="tic"]
    sumdt[, daterange:= max.date-min.date]
    # Merge the summary data.table back into dt, based on key
    dt <- dt[sumdt]
})
# ELAPSED TIME IN SECONDS
# user  system elapsed 
# 1.45    0.25    1.77 
Run Code Online (Sandbox Code Playgroud)