2013-12-19 63 views
1

最近我正在處理1GB json格式的文件,使用fromJSON函數將其轉換爲長度大約爲4百萬的列表後,我想刮掉列表中的一個特定元素。 我的列表看起來像這樣(tweets.list是我的列表的名稱,與4132406長度),如何提高抓取列表元素的向量的速度? (大數據)

> tweets.list[[1]] 

$`_id` 
[1] "371045756826050561" 

$text 
[1] "RT @arabic_Leos: لو #الأسد في حالة إعجاب، تجده يتحدث عن الشخص طول الوقت، يفكر به ويكتب عنه يبحث عن صفحاته في النت ويدمن عليه، لذا احتمالية …" 

$created_at 
[1] "Fri Aug 23 23:06:16 +0000 2013" 

現在我只希望在列表中的每一個「created_at」的價值,因此我的代碼如下:

tweets.unlist<-unlist(tweets.list) 

create.date<-0 
for(i in 1:(length(tweets.unlist)/3)){ 
create.date[i]<-tweets.unlist[3*i] 
} 

我已經奔波這段代碼24小時,似乎無止境的,我不知道是否有任何更快,足夠簡單的替代品做到這一點?由於我也需要在將其轉換爲所需格式後進行一些分析,因此我期待着一種通用解決方案,它不僅可以提高轉換速度,還可以提高整體計算速度。謝謝大家!

+0

嘗試'lapply(tweets.list,'[[','created_at')' –

+0

哇,這是一個非常意想不到的方法!永遠不會知道我可以用這種方式,我會嘗試,謝謝! –

+0

它耗費我大約10秒!太棒了!再次感謝你!!! –

回答

1

這是一個基準。你原來的實現的問題是,你正在增長R的真正糟糕的向量create.date。一個簡單的改變將減少運行時間很多隻是在for循環之前預先分配矢量(即代替create.date <- 0執行create.date <- character(length(x)))。

library(microbenchmark) 

tweet <- list(id = 123456, text = "foo", created = as.character(Sys.time())) 

tweets.list <- rep(list(tweet), 1e5) 

for_growing <- function(x) { 
    x.unlist <- unlist(x) 

    create.date <- 0 
    for (i in 1:(length(x)/3)) { 
     create.date[i] <- x.unlist[3*i] 
    } 

} 

for_prealloc <- function(x) { 
    x.unlist <- unlist(x) 

    create.date <- character(length(x)) 
    for (i in 1:(length(x)/3)) { 
     create.date[i] <- x.unlist[3*i] 
    } 
} 

lapply_jake <- function(x) { 
    lapply(x, "[[", "created") 
} 

mod_james <- function(x) { 
    x.unlist <- unlist(x) 

    x.unlist[!seq(length(x.unlist)) %% 3] 
} 


microbenchmark(
    for_growing(tweets.list), 
    for_prealloc(tweets.list), 
    lapply_jake(tweets.list), 
    mod_james(tweets.list), 
    times = 10L 
    ) 

## Unit: milliseconds 
##      expr  min   lq  median   uq 
## for_growing(tweets.list) 3167.38761 3174.06745 3238.12112 3330.79536 
## for_prealloc(tweets.list) 395.30506 397.10530 400.93948 404.11285 
## lapply_jake(tweets.list) 63.57347 64.88034 65.50494 69.94222 
## mod_james(tweets.list) 325.38708 327.81474 334.16780 363.51899 
##  max neval 
## 3480.2019 10 
## 433.8970 10 
## 110.4278 10 
## 370.6554 10 
+0

謝謝,謝謝,謝謝!這真的讓我心碎!在這個概念中,我確實感受到了巨大的思想。謝謝傑克! –

相關問題