2013-04-18 122 views
0

本質上,我有一個大的數據框:10,000,000x900(行,列),我試圖並行地轉換每列的類。最終的結果必須是一個data.frameR並行大型數據幀轉換

這裏就是我有這麼遠:

假裝df是已經定義的數據幀,所有列是數字和字符類的混合物

library(snow) 
cl=makeCluster(50,type="SOCK") 
cl.out=clusterApplyLB(cl,df,function(x)factor(x,exclude=NULL)) 

cl.out是我想要的,只是我需要的是這是一個data.frame類列表

所以這是我卡住...我要嘗試,並結合所有的元素cl.out到data.frame w這不會是平行的嗎? (SLOW,時間是個問題)

我可以使用不同的包來實現其他東西嗎? (foreach?)

我必須硬編碼一些c纔能有效地完成這項工作嗎?

任何幫助,將不勝感激。

感謝,

回答

0

由於data.frame是一個列表,用class屬性, 你可以轉換列表爲data.frame, 與as.data.frame

cl.out <- as.data.frame(cl.out) 

我注意到,列名都將丟失:如果你確信他們是在同一順序 ,您可以設置回用:

names(cl.out) <- names(df) 
+0

轉換是相當緩慢的使用過程。我相信還有比簡單地將類屬性附加到數據blob上更多的東西。 –

+0

它不是很乾淨,但可以嘗試直接更改屬性: 'class(cl.out)< - 「data.frame」'。 –

2

一個有用的範例是子集,更換所有列,治療df如列表類似

df[] <- lapply(df, factor, exclude=NULL) 

你真的有一臺機器上50個內核,如所暗示的您的來電makeCluster?如果你不是在Windows機器上,使用parallel包和mclapply代替

library(parallel) 
options(mc.cores=50) 
df[] <- mclapply(df, factor, exclude=NULL) 

,這真的會幫助你在你的總體評價?似乎要花費盡可能多的代價來分配和檢索數據以進行計算。

> f = factor(rep("M", 10000000), levels=LETTERS) 
> df = data.frame(f, f, f, f, f, f, f, f) 
> system.time(lapply(df, factor, exclude=NULL)) 
    user system elapsed 
    2.676 0.564 3.250 
> system.time(clusterApply(cl, df, factor, exclude=NULL)) 
    user system elapsed 
    1.488 0.752 2.476 
> system.time(mclapply(df, factor, exclude=NULL)) 
    user system elapsed 
    1.876 1.832 1.814 

(多核和多進程計時可能高度可變)。

1

如果你有一個這樣的大小的數據幀,我認爲你會很快遇到內存問題非常

我認爲它會更快,更高效。

你可以使用set

library(data.table) 

# to set as a data.table without having to copy 
setattr(df, 'class', c('data.table','data.frame') 
alloc.col(df) 

for(nn in names(df)){ 
    set(df, j = nn, value = factor(df[[nn]]) 
} 

值得一讀data.table and parallel computing