r-需要更具内存效率的方法来过滤日期值的矢量



这里的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记录了更多的信息,因此您可以使用,例如$yearPOSIXct只计算自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]

相关内容

  • 没有找到相关文章

最新更新