R:jsonlite的stream_out函数产生不完整的/截断的JSON文件
我试图在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
我那么必须手动删除最后一行之后,文件加载没有问题。
解决方案我已经试过
我试图彻底阅读文档和看
stream_out
功能,我想不出什么可能会造成这个问题。我唯一的线索是,stream_out
函数在完成时自动关闭连接,所以也许它正在关闭连接,而其他组件仍在写入?我插入的打印功能打印
data.frame
的tail()
结束在handler
函数内每块排除问题与中介data.frame
。data.frame
是在每个时间间隔都完美地生成的,我可以看到data.frame
的最后两行或三行在写入文件时被截断(即它们没有被写入)。请注意,这是整个data.frame
(在stream_out
有rbind
编辑的所有东西之后)的最后部分。我试着玩
pagesize
参数,包括尝试非常大的数字,没有数字和Inf
。没有任何工作。因为原来的JSON文件太大不流读取,它实际上是在精缩(?)/
ndjson
格式我不能使用jsonlite
的其他功能,如fromJSON
。
系统信息
我在Windows 7 64位系统运行v 3.3.3 64位。 6 GB内存,AMD Athlon II 4核2.6 Ghz。
治疗
我还是可以处理这个问题通过手动打开JSON文件和纠正它们,但它导致一些数据丢失,这不是让我的脚本来实现自动化,这是一个不便之处如我必须在我的项目中反复运行它。
我真的很感谢任何帮助;谢谢。
我相信这是做你想做的,没有必要做额外的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
列。)
(〜题外话,但〜相关)。查看Apache Drill - drill.apache.org。它处理流JSON(ndjson),你可以通过'sergeant'包使用dplyr。 – hrbrmstr
谢谢hrbrmstr!如果我有成功,我会检查并报告。 –