2012-08-12 44 views
2

我有一個xts對象,大約2 mil行。我正在嘗試使用rollapplywidth=10000。 rollapply似乎耗盡內存,我無法弄清楚爲什麼? (我試圖通過鍵入> rollapply看看源代碼,但僅此顯示出來:xts中的內存溢出內存不足R

function (data, ...) 
UseMethod("rollapply") 
<environment: namespace:zoo> 

不rollapply創造200萬組 - 每塊10000份,然後通過一個把它們放入一個這樣肯定會造成其?耗盡內存,但我不認爲zoo的創造者會這樣做?如果是這樣的話,那麼有沒有人知道一個更聰明的方式來做我的滾動應用..我目前的計劃是簡單地做到這一點:

m <- vector() 
for (i in 10001:nrow(my_xts)) { 
    m <- c(m, my_fun(my_xts[i-10000:i])) 

} 

肯定有一個更好的辦法?

+2

您目前的計劃,使在一個循環中生長對象的大忌。您需要在循環前預先分配結果,並將每個函數的結果插入結果向量的第i個元素中。 – 2012-08-12 00:46:42

+1

如果你的函數對應於其中的一個,動物園包已經優化了(對於速度而不是內存)'rollmean','rollmax'和'rollmedian',但它可能是其中一些或全部使用更少的內存。 – 2012-08-12 12:51:38

回答

3

看起來內存消耗發生在mapply調用zoo:::rollapply.zoo期間。有一個xts rollapply方法,但它不會被導出,所以它不會通過方法調度來調用。這就是說,你可以明確地調用它:

my_xts <- .xts(1:1e5*1,1:1e5) 
m <- xts:::rollapply.xts(my_xts, width=10000, FUN=sum) 

使用methods(foo)看到每當你遇到什麼方法可用:

function(...) 
    UseMethod("foo") 
+0

你怎麼看待源代碼?所以對於'rollapply.zoo'它是'動物園::: rollapply.zoo'但我怎麼會知道,只是從做'方法(rollapply)'? – Alex 2012-08-12 02:26:49

+0

也是,爲什麼'xts :: rollapply.xts'不能導出?只是想知道它裏面是否還有缺陷需要解決。 – Alex 2012-08-12 02:38:57

+1

@Alex:'方法(rollapply)'顯示方法和註釋:「非可見函數被星號標記」。這意味着它們不會被導出,您必須使用'package :::'語法。 'rollapply.xts'不會被導出,因爲我們很快就寫了,並且沒有在當時進行太多的測試。現在它可能會被導出。這是在我的待辦事項清單上。 – 2012-08-12 02:50:30