2013-01-23 34 views
1

我有一個大對象列表(比如說100k元素)。每個元素都必須通過一個函數「process」進行處理,但是我想以大塊的形式進行處理......比如說20次傳遞,因爲我想將處理結果保存到硬盤文件中並保持內存空閒。處理大量的對象在R

我是新來的R,我知道它應該涉及一些應用魔法,但我不知道如何去做(但)。

任何指導將不勝感激。

一個小例子:

objects <- list(); 
for (i in 1:100){ 
objects <- append(objects, 500); 
} 
objects; 





processOneElement <- function(x){ 
x/20 + 23; 
} 

我想處理一氣呵成第20個元素,並保存結果的話,處理在二去第二次20元,並保存結果...等等

objects <- list(); 
for (i in 1:100){ 
objects <- append(objects, 500); 
} 
objects; 

process <- function(x){ 
x/20 + 23; 
} 

results <- lapply(objects, FUN=process) 



index <- seq(1, length(objects), by=20); 
lapply(index, function(idx1) { 
idx2 <- min(idx1+20-1, length(objects)); 
batch <- lapply(idx:idx2, function(x) { 
process(objects[[x]]); 
}) 

write.table(batch, paste("batch", idx1, sep="")); 
}) 
+2

要接受指導,你必須首先提供指導,在[重複的例子]的形式(http://stackoverflow.com/q/5963269/324364)。添加可重複代碼 – joran

+0

迄今爲止 – user13467

+0

工作代碼已更新。 – user13467

回答

2

用你給出的,這是我可以建議的答案。假設你的列表存儲在list.object

lapply(seq(1, length(list.object), by=20), function(idx) { 
    # here idx will be 1, 21, 41 etc... 
    idx2 <- min(idx+20-1, length(list.object)) 
    # do what you want here.. 
    batch.20.processed <- lapply(idx:idx2, function(x) { 
     process(list.object[[x]]) # passes idx:idx2 indices one at a time 
    }) 
    # here you have processed list with 20 elements 
    # finally write to file 
    lapply(1:20, function(x) { 
     write.table(batch.20.processed[[x]], ...) 
     # where "..." is all other allowed arguments to write.table 
     # such as row.names, col.names, quote etc. 
     # don't literally pass "..." to write.table 
    }) 
} 
+0

嗨,我實際上已經加載了所有的數據。我將保存將批處理結果保存到文件中的結果。我還在原始問題中添加了一些可重現的代碼 – user13467

+0

處理每個元素會導致相對來說大的對象,所以我無法一次處理所有這些對象...我需要處理前20個保存結果並重復這個過程,直到我完成 – user13467

+0

我試過lapply(obejcts,FUN = process),但輸出太大 – user13467