在R中读取一个巨大的json文件,问题

时间:2015-04-17 02:01:25

标签: json r

我正在尝试使用R读取非常大的json文件,我正在使用RJSON库来表达json_data <- fromJSON(paste(readLines("myfile.json"), collapse=""))

问题是我收到此错误消息

Error in paste(readLines("myfile.json"), collapse = "") : 

无法在C函数中分配内存(2383 Mb)&#39; R_AllocStringBuffer&#39;

任何人都可以帮我解决这个问题

3 个答案:

答案 0 :(得分:3)

好吧,只是分享我对read json file的体验。的进展 我试图读取52.8MB,19.7MB,1.3GB,93.9MB,158.5MB json文件花费我30分钟,最后自动恢复R会话,之后尝试应用并行计算,并希望看到进度但失败。

https://github.com/hadley/plyr/issues/265

然后我尝试添加参数 pagesize = 10000 ,它的工作效率更高效。好吧,我们只需要读取一次,然后另存为RDS / Rda / Rds格式,如saveRDS。

> suppressPackageStartupMessages(library('BBmisc'))
> suppressAll(library('jsonlite'))
> suppressAll(library('plyr'))
> suppressAll(library('dplyr'))
> suppressAll(library('stringr'))
> suppressAll(library('doParallel'))
> 
> registerDoParallel(cores=16)
> 
> ## https://www.kaggle.com/c/yelp-recsys-2013/forums/t/4465/reading-json-files-with-r-how-to
> ## https://class.coursera.org/dsscapstone-005/forum/thread?thread_id=12
> fnames <- c('business','checkin','review','tip','user')
> jfile <- paste0(getwd(),'/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_',fnames,'.json')
> dat <- llply(as.list(jfile), function(x) stream_in(file(x),pagesize = 10000),.parallel=TRUE)
> dat
list()
> jfile
[1] "/home/ryoeng/Coursera-Data-Science-Capstone/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_business.json"
[2] "/home/ryoeng/Coursera-Data-Science-Capstone/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_checkin.json" 
[3] "/home/ryoeng/Coursera-Data-Science-Capstone/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_review.json"  
[4] "/home/ryoeng/Coursera-Data-Science-Capstone/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_tip.json"     
[5] "/home/ryoeng/Coursera-Data-Science-Capstone/yelp_dataset_challenge_academic_dataset/yelp_academic_dataset_user.json"    
> dat <- llply(as.list(jfile), function(x) stream_in(file(x),pagesize = 10000),.progress='=')
opening file input connection.
 Imported 61184 records. Simplifying into dataframe...
closing file input connection.
opening file input connection.
 Imported 45166 records. Simplifying into dataframe...
closing file input connection.
opening file input connection.
 Found 470000 records...

答案 1 :(得分:2)

我在使用R.中的大型数据集时遇到了同样的问题。我在R中使用了jsonlite包来读取R.中的json。我使用以下代码来读取R中的json:

library(jsonlite)
get_tweets <- stream_in(file("tweets.json"),pagesize = 10000)

这里tweets.json是我的文件名及其存在的位置,pagesize表示它在一次迭代中读取的行数。希望它有所帮助。

答案 2 :(得分:2)

出于某种原因,上述解决方案都导致R终止或更糟。

此解决方案适用于我,使用相同的数据集:

library(jsonlite)
file_name <- 'C:/Users/Downloads/yelp_dataset/yelp_dataset~/dataset/business.JSON'
business<-jsonlite::stream_in(textConnection(readLines(file_name, n=100000)),verbose=F)

花了大约15分钟