R:jsonlite的stream_out函数生成不完整/截断的JSON文件

时间:2017-09-05 09:59:29

标签: json r file-writing jsonlite

我正在尝试将一个非常大的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))

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

我尝试过的解决方案

  1. 我已经尝试彻底阅读文档并查看{"Var1":"some data","Var2":3,"Var3":"some othe 函数,但我无法弄清楚可能导致此问题的原因。我唯一的轻微线索是stream_out函数在完成时会自动关闭连接,所以可能它正在关闭连接而其他一些组件仍然在写?

  2. 我插入了一个打印功能,以便在stream_out功能内的每个块上打印tail()的{​​{1}}端,以排除中间人data.frame的问题。 handler在每个时间间隔都可以完美地生成,我可以看到data.frame的最后两行或三行在写入文件时被截断(即,它们没有被写入)。请注意,这是整个data.frame(在data.frame之后data.frame编辑所有内容)的最后一部分被切断。

  3. 我尝试过使用stream_out个参数,包括尝试非常大的数字,没有数字和rbind。没有任何效果。

  4. 我不能使用pagesize的其他函数,例如Inf,因为原始的JSON文件太大而无法在没有流式传输的情况下读取,而且它实际上是缩小的(?)/ {{ 1}}格式。

  5. 系统信息

    我在Windows 7 x64上运行R 3.3.3 x64。 6 GB RAM,AMD Athlon II 4核2.6 Ghz。

    治疗

    我仍然可以通过手动打开JSON文件并纠正它们来解决这个问题,但它会导致一些数据丢失,并且它不允许我的脚本自动化,这是一个不便,因为我必须在我的整个过程中重复运行它项目。

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

1 个答案:

答案 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列。)