我正在尝试将一个非常大的JSON文件加载到R中。由于文件太大而无法容纳到我的计算机上的内存中,我发现使用jsonlite
包的stream_in
/ {{ 1}}函数真的很有帮助。使用这些函数,我可以先在块中对数据进行子集化而不加载它,将子集数据写入新的较小的JSON文件,然后将该文件作为stream_out
加载。但是,在使用data.frame
编写时,此中间JSON文件将被截断(如果这是正确的术语)。我现在将尝试进一步详细解释。
我正在尝试的内容:
我已经编写了这样的代码(遵循文档中的示例):
stream_out
如您所见,我打开与临时文件的连接,使用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))
读取原始JSON文件,并在每个数据块中使用stream_in
函数子集并将其写入连接。 / p>
问题
此过程运行没有任何问题,直到我尝试在handler
中读取它,然后我收到错误。手动打开新的临时JSON文件会显示最底部的行始终不完整。如下所示:
myData <- stream_in(file(tmp))
然后我必须手动删除最后一行,之后文件加载没有问题。
我尝试过的解决方案
我已经尝试彻底阅读文档并查看{"Var1":"some data","Var2":3,"Var3":"some othe
函数,但我无法弄清楚可能导致此问题的原因。我唯一的轻微线索是stream_out
函数在完成时会自动关闭连接,所以可能它正在关闭连接而其他一些组件仍然在写?
我插入了一个打印功能,以便在stream_out
功能内的每个块上打印tail()
的{{1}}端,以排除中间人data.frame
的问题。 handler
在每个时间间隔都可以完美地生成,我可以看到data.frame
的最后两行或三行在写入文件时被截断(即,它们没有被写入)。请注意,这是整个data.frame
(在data.frame
之后data.frame
编辑所有内容)的最后一部分被切断。
我尝试过使用stream_out
个参数,包括尝试非常大的数字,没有数字和rbind
。没有任何效果。
我不能使用pagesize
的其他函数,例如Inf
,因为原始的JSON文件太大而无法在没有流式传输的情况下读取,而且它实际上是缩小的(?)/ {{ 1}}格式。
系统信息
我在Windows 7 x64上运行R 3.3.3 x64。 6 GB RAM,AMD Athlon II 4核2.6 Ghz。
治疗
我仍然可以通过手动打开JSON文件并纠正它们来解决这个问题,但它会导致一些数据丢失,并且它不允许我的脚本自动化,这是一个不便,因为我必须在我的整个过程中重复运行它项目。
我真的很感激任何帮助;谢谢。
答案 0 :(得分:1)
我相信这可以做你想要的,没有必要做额外的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行,因此是小页面大小,以检查是否所有内容都使用了多个块。我使用的过滤器甚至是ID,因为我懒得创建一个Var
列。)