简单的循环导致内存溢出(基数R)

时间:2016-12-12 15:26:55

标签: r for-loop out-of-memory time-series

我让我的记忆与一个非常简单的循环交换,我看不到问题。我正在研究一种工具来清理10分钟时间步的时间序列。它可能有时间步长,双倍时间步长和不规则的10分钟间隔时间步长。我的方法是首先生成“干净”的时间序列,然后匹配“好的”时间步骤。在那之后,我想检查超出常规的10分钟间隔时间步骤。这就是出现问题的地方。对不起长代码:

测试数据生成:

rm(list = ls())
Sys.setenv(TZ="Europe/Berlin")
Sys.timezone()
DATE = seq( as.POSIXct("2015-03-28 00:00:00", tz="Europe/Berlin"),
            as.POSIXct("2015-04-26 23:00:00", tz="Europe/Berlin"), by = 600)
V1 = round(2*runif(length(DATE)), 2)
DF <- data.frame(DATE, V1)

添加一些“不良”数据:

DF2 <- data.frame(DATE= as.POSIXct(c("2015-04-05 05:00:00", 
                                     "2015-04-05 05:00:00", 
                                     "2015-04-10 10:00:00", 
                                     "2015-04-15 15:15:00", 
                                     "2015-04-20 20:02:00", 
                                     "2015-04-26 23:07:00",
                                     "2015-04-26 23:17:00",
                                     "2015-04-26 23:27:00",
                                     "2015-04-26 23:37:00")),
                  V1 = c("0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77"))
DF <- rbind(DF, DF2)
DF <- DF[ order(DF$DATE), ]

定义一些时间变量和最终的“干净”时间序列:

START_DATE    <- as.POSIXct("2015-03-28 00:00:00", tz="Europe/Berlin") 
END_DATE      <- as.POSIXct("2015-04-26 23:40:00", tz="Europe/Berlin")
tdiff         <- difftime("2015-03-28 00:10:00", "2015-03-28 00:00:00", 
                   tz="Europe/Berlin", units = "mins")
DT            <- seq( START_DATE, END_DATE, by = 600)
DF_clean      <- DF[match(DT,DF$DATE), ]

很长一段时间,你可以看到DF_clean看起来已经相当不错,但最后4行是NA,因为时间步长超出了常规的10分钟间隔。因此,我需要查看这些时间步之间是否存在任何数据,并将它们移至正确的10分钟间隔。

for (var in DT[ which( is.na(DF_clean$DATE))]) {
  has.value <- DF$DATE > as.POSIXct(var, origin="1970-01-01") - tdiff & 
               DF$DATE < as.POSIXct(var, origin="1970-01-01")
  DF_clean[as.POSIXct(var, origin="1970-01-01"), ] <- DF[ has.value, ]
}

如果我使用var <- "2015-04-26 23:10:00 CEST"手动运行for循环的内容,则可以正常运行。运行整个循环会导致交换内存。我认为这与在循环内和[]中使用POSIXct有关,但我无法弄清楚如何使用- tdiff

我还没有尝试过任何软件包,因为我真正对基础R解决方案感兴趣,因为在我不了解任何软件包之前我没有真正理解基础R.;)

1 个答案:

答案 0 :(得分:2)

这就是你要找的东西:

for (ind in which(is.na(DF_clean$DATE))) {
  has.value <- DF$DATE > as.POSIXct(DT[ind], origin="1970-01-01") - tdiff & 
    DF$DATE < as.POSIXct(DT[ind], origin="1970-01-01")
  DF_clean[ind, ] <- DF[ has.value, ]
}