我有一个大型JSON文件(8 GB,800万个案例),但我只需要一小部分样本。简单stream_in
不起作用,因为文件太大。
为了解决这个问题,我尝试了以下代码:
books <- list("Books_5.json")
books <- map(books, ~ stream_in(file(.x)) %>% sample_n(385))
books <- as.data.frame(books)
问题是,在300万页后,R停止读取文件,因为文件太大了。任何想法我如何得到385个案例的样本?
较小文件的示例。变量是相同的。
Variables: 9
$ reviewerID <chr> "AF50PEUSO9MSV", "A1L0TVAJ1TYE06", "A64NRL5OSR3KB", ...
$ asin <chr> "B0000A1G05", "B009SQQF9C", "B005HRT88G", "B00D5T3QK...
$ reviewerName <chr> "Matthew J. Hodgkins", "TCG", "Me", "J. Lee", "A. Bu...
$ helpful <list> [<1, 1>, <0, 1>, <1, 1>, <0, 0>, <0, 0>, <0, 0>, <0...
$ reviewText <chr> "This is the lens that I always keep on my camera by...
$ overall <dbl> 5, 5, 5, 5, 5, 5, 5, 4, 5, 2, 5, 4, 5, 4, 5, 5, 3, 4...
$ summary <chr> "Great lens!", "I love them! What else can I say", "...
$ unixReviewTime <int> 1370736000, 1404518400, 1387411200, 1385769600, 1379...
$ reviewTime <chr> "06 9, 2013", "07 5, 2014", "12 19, 2013", "11 30, 2...
答案 0 :(得分:2)
如果您的文件每行有一个案例,您可以使用LaF
包非常有效地执行此操作:
library(LaF)
random_lines <- sample_lines(filename = "Books_5.json",
n = 385)
然后,您可能必须将行转换为所需的格式,但此解决方案允许从大文件中读取而无需将所有内容读入内存。
修改强>
将结果行转换为data.frame
:
do.call("rbind",lapply(random_lines, fromJSON))
只要JSON对象中的字段只包含单个值(即不嵌套),这就应该有效。