2013-05-11 39 views
2

我該如何做到這一點重塑更快,並使其佔用更少的內存?我的目標是用4 Gb RAM重新塑造500,000行500列的數據幀。在更短的時間內重塑交替列,並使用更少的內存

這裏有一個功能,這將使一些重複性的數據:

make_example <- function(ndoc, ntop){ 
# doc numbers 
V1 = seq(1:ndoc) 
# filenames 
V2 <- list("vector", size = ndoc) 
for (i in 1:ndoc){ 
V2[i] <- paste(sample(c(rep(0:9,each=5),LETTERS,letters),5,replace=TRUE),collapse='') 
} 
# topic proportions 
tvals <- data.frame(matrix(runif(1:(ndoc*ntop)), ncol = ntop)) 
# topic number 
tnumvals <- data.frame(matrix(sample(1:ntop, size = ndoc*ntop, replace = TRUE), ncol = ntop)) 
# now make topic props and topic numbers alternating columns (rather slow!) 
alternating <- data.frame(c(matrix(c(tnumvals, tvals), 2, byrow = T))) 
# make colnames for topic number and topic props 
ntopx <- sapply(1:ntop, function(j) paste0("ntop_",j)) 
ptopx <- sapply(1:ntop, function(j) paste0("ptop_",j)) 
tops <- c(rbind(ntopx,ptopx)) 
# make data frame 
dat <- data.frame(V1 = V1, 
       V2 = unlist(V2), 
       alternating) 
names(dat) <- c("docnum", "filename", tops) 
# give df as result 
return(dat) 
} 

做一些重複性的數據:

set.seed(007) 
dat <- make_example(500000, 500) 

這是我當前的方法(感謝https://stackoverflow.com/a/8058714/1036500):

library(reshape2) 
NTOPICS = (ncol(dat) - 2)/2 
nam <- c('num', 'text', paste(c('topic', 'proportion'), rep(1:NTOPICS, each = 2), sep = "")) 

system.time(dat_l2 <- reshape(setNames(dat, nam), varying = 3:length(nam), direction = 'long', sep = "")) 
system.time(dat.final2 <- dcast(dat_l2, dat_l2[,2] ~ dat_l2[,3], value.var = "proportion")) 

一些時間,只爲reshape,因爲這是緩慢的共青步:

make_example(5000,100) = 82秒

make_example(50000,200) = 2855秒(墜毀在試圖第二步)

make_example(500000,500) =沒有可能......

什麼其他的方法有那些是對於此重整更快且更少的內存密集(data.tablethis)?

回答

2

我非常懷疑當傳遞一個500000 x 500的數據幀時,這會成功地處理那麼少量的RAM。我想知道你是否可以在這個有限的空間裏做簡單的行動。購買更多的RAM。此外,reshape2速度很慢,所以使用stats :: reshape來做大事。並提供有關分隔符是什麼的提示。

> set.seed(007) 
> dat <- make_example(5, 3) 
> dat 
    docnum filename ntop_1  ptop_1 ntop_2 ptop_2 ntop_3 ptop_3 
1  1 y8214  3 0.06564574  1 0.6799935  2 0.8470244 
2  2 e6x39  2 0.62703876  1 0.2637199  3 0.4980761 
3  3 34c19  3 0.49047504  3 0.1857143  3 0.7905856 
4  4 1H0y6  2 0.97102441  3 0.1851432  2 0.8384639 
5  5 P6zqy  3 0.36222085  3 0.3792967  3 0.4569039 

> reshape(dat, direction="long", varying=3:8, sep="_") 
    docnum filename time ntop  ptop id 
1.1  1 y8214 1 3 0.06564574 1 
2.1  2 e6x39 1 2 0.62703876 2 
3.1  3 34c19 1 3 0.49047504 3 
4.1  4 1H0y6 1 2 0.97102441 4 
5.1  5 P6zqy 1 3 0.36222085 5 
1.2  1 y8214 2 1 0.67999346 1 
2.2  2 e6x39 2 1 0.26371993 2 
3.2  3 34c19 2 3 0.18571426 3 
4.2  4 1H0y6 2 3 0.18514322 4 
5.2  5 P6zqy 2 3 0.37929675 5 
1.3  1 y8214 3 2 0.84702439 1 
2.3  2 e6x39 3 3 0.49807613 2 
3.3  3 34c19 3 3 0.79058557 3 
4.3  4 1H0y6 3 2 0.83846387 4 
5.3  5 P6zqy 3 3 0.45690386 5 

> system.time(dat <- make_example(5000,100)) 
    user system elapsed 
    2.925 0.131 3.043 
> system.time(dat2 <- reshape(dat, direction="long", varying=3:202, sep="_")) 
    user system elapsed 
16.766 8.608 25.272 

我會說,在這個過程中,這是不是你的目標更小的250倍,32 GB的內存總容量的1/5左右見怪不怪,所以我並不感到驚訝,你的機器掛。 (它不應該「崩潰」 R的作者寧願你給出準確的行爲描述,我懷疑R進程在分頁到虛擬內存時停止響應。)我遇到了性能問題,我需要解決使用32 GB時,數據集爲700萬條記錄×100列。

+0

感謝您再次看看這個。關於'stats :: reshape'和分隔符的提示很有用。採取的措施是,我將使用內存更多的機器(或者可以使用Perl來完成這個特定的步驟,甚至可以用茱莉亞打破僵局......)。我明白你的意思是關於準確的行爲描述,我正在報告我看到RStudio在做什麼(實際上不知道R在做什麼......)。再次感謝。 – Ben 2013-05-12 04:43:14

相關問題