2013-12-19 29 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

谢谢,谢谢,谢谢!这真的让我心碎!在这个概念中,我确实感受到了巨大的思想。谢谢杰克! –

相关问题