需要更多内存有效的方法来过滤日期值的向量

时间:2011-06-06 21:27:23

标签: r datetime vector memory-management filter

这里的R新手总数(到目前为止非常高兴!)。

我有一个大数组(矢量?)的日期信息,我想删除那些不符合我感兴趣的日期范围的行(这是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

我计划按年过滤以删除大部分信息,然后使用相同的方法按月/日/小时过滤

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

继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]