2017-09-05 128 views
0

我试图在R中加载一个非常大的JSON文件。由于文件太大而无法放入我的机器的内存中,我发现使用jsonlite程序包的stream_in/stream_out函数真的很有帮助。使用这些函数,我可以首先以数据块为基础对数据进行子集分类,而不加载数据,将子集数据写入新的较小的JSON文件,然后将该文件作为data.frame加载。但是,这个中间JSON文件正在被写入stream_out,被截断(如果这是正确的话)。现在我将尝试解释更多细节。R:jsonlite的stream_out函数产生不完整的/截断的JSON文件

我正在尝试:

我已经写了我这样的代码,(从文件为例):

con_out <- file(tmp <- tempfile(), open = "wb") 
stream_in(file("C:/User/myFile.json"), handler = function(df){ 
     df <- df[which(df$Var > 0), ] 
     stream_out(df, con_out, pagesize = 1000) 
    }, pagesize = 5000) 
myData <- stream_in(file(tmp)) 

正如你所看到的,我开到一个临时的连接文件,用stream_in读取我的原始JSON文件,并将handler函数子集中的每个数据块写入连接。

这个程序运行没有任何问题,直到我尝试在myData <- stream_in(file(tmp))读它,在我收到一个错误的问题。手动打开新的临时JSON文件显示最底部的行总是不完整的。像下面这样:

{"Var1":"some data","Var2":3,"Var3":"some othe 

我那么必须手动删除最后一行之后,文件加载没有问题。

解决方案我已经试过

  1. 我试图彻底阅读文档和看stream_out功能,我想不出什么可能会造成这个问题。我唯一的线索是,stream_out函数在完成时自动关闭连接,所以也许它正在关闭连接,而其他组件仍在写入?

  2. 我插入的打印功能打印data.frametail()结束在handler函数内每块排除问题与中介data.framedata.frame是在每个时间间隔都完美地生成的,我可以看到data.frame的最后两行或三行在写入文件时被截断(即它们没有被写入)。请注意,这是整个data.frame(在stream_outrbind编辑的所有东西之后)的最后部分。

  3. 我试着玩pagesize参数,包括尝试非常大的数字,没有数字和Inf。没有任何工作。

  4. 因为原来的JSON文件太大不流读取,它实际上是在精缩(?)/ ndjson格式我不能使用jsonlite的其他功能,如fromJSON

系统信息

我在Windows 7 64位系统运行v 3.3.3 64位。 6 GB内存,AMD Athlon II 4核2.6 Ghz。

治疗

我还是可以处理这个问题通过手动打开JSON文件和纠正它们,但它导致一些数据丢失,这不是让我的脚本来实现自动化,这是一个不便之处如我必须在我的项目中反复运行它。

我真的很感谢任何帮助;谢谢。

+1

(〜题外话,但〜相关)。查看Apache Drill - drill.apache.org。它处理流JSON(ndjson),你可以通过'sergeant'包使用dplyr。 – hrbrmstr

+0

谢谢hrbrmstr!如果我有成功,我会检查并报告。 –

回答

0

我相信这是做你想做的,没有必要做额外的stream_out/stream_in

myData <- new.env() 
stream_in(file("MOCK_DATA.json"), handler = function(df){ 
    idx <- as.character(length(myData) + 1) 
    myData[[idx]] <- df[which(df$id %% 2 == 0), ] ## change back to your filter 
}, pagesize = 200) ## change back to 1000 
myData <- myData %>% as.list() %>% bind_rows() 

(我在Mockaroo创建了一些模拟数据:产生1000条线,因此小的页面大小,以检查是否一切有超过一个大块工作,因为我是个懒人创造一个我使用的过滤器甚至标识。 Var列。)