这里的R新手总数(到目前为止非常高兴!)。
我有一个大的日期信息数组(vector?),我想删除不符合我感兴趣的日期范围的行(即2003年9月24日至2003年12月10日,每天中午12点至6点)。我的内存好像用完了
这是一个问题的例子,正如我所说:
> head(p_times)
[1] "2001-04-11 07:57:27 EDT" "2001-04-11 08:18:11 EDT"
[3] "2001-04-11 08:21:33 EDT" "2001-04-11 08:22:52 EDT"
[5] "2001-04-11 08:25:39 EDT" "2001-04-11 08:31:18 EDT"
> length(p_times)
[1] 31164014
> class(p_times)
[1] "POSIXlt" "POSIXt"
> fp_times = p_times[p_times$year==103]
R(59593,0xa0506540) malloc: *** mmap(size=249315328) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(59593,0xa0506540) malloc: *** mmap(size=124657664) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(59593,0xa0506540) malloc: *** mmap(size=57901056) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
我计划按年过滤以删除大部分信息,然后使用相同的方法按月/天/小时过滤
你能用POSIXct
代替POSIXlt
吗?POSIXlt
对象占用的内存似乎是POSIXct
对象的5倍:
> set.seed(21)
> x <- Sys.time() - trunc(runif(31164014)*3e8); range(x)
[1] "2001-12-03 11:55:25 CST" "2011-06-06 18:15:07 CDT"
> print(object.size(x), units="Mb")
237.8 Mb
> print(object.size(as.POSIXlt(x)), units="Mb")
1188.8 Mb
> 1188.8/237.8
[1] 4.999159
> sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
根据Joshua的回答:POSIXlt
记录了更多的信息,因此您可以使用,例如$year
。POSIXct
只计算自UNIX纪元以来的秒数。因此POSIXct
较小,但不太方便。但如果你计算相关时间,你仍然可以用这个过滤:
start <- unclass(as.POSIXct("2003-09-24"))-unclass(as.POSIXct("1970-01-01"))
end <- unclass(as.POSIXct("2003-12-11"))-unclass(as.POSIXct("1970-01-01"))
p_times <- as.POSIXct(p_times)
fp_times <- p_times[p_times>start & p_times<end]