Нужен более эффективный по памяти метод фильтрации вектора значений даты - PullRequest
1 голос
/ 07 июня 2011

Всего новичков в R здесь (пока что очень приятно!).

У меня большой массив (вектор?) Информации о дате, и я хотел бы удалить строки, которые не вписываются в интересующий меня диапазон дат (с 24 сентября 2003 года по 10 декабря)-2003, с 12 до 18 часов каждый день).Кажется, мне не хватает памяти

Вот пример проблемы, которую я могу выразить:

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

1 голос
/ 07 июня 2011

Исходя из ответа Джошуа: 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]
1 голос
/ 07 июня 2011

Не могли бы вы использовать POSIXct вместо POSIXlt? POSIXlt объекты, кажется, занимают примерно в 5 раз больше памяти, чем POSIXct объекты:

> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...