使用管道工和R发送JSON文件时的变量名限制(10000字节)

时间:2019-01-22 15:22:10

标签: r json production-environment plumber

我正在使用R,plumber和Docker编写生产级代码来创建API。我的API的输入是一个JSON文件,输出也是JSON格式。当我的输入文件超过一定的空间/内存限制时,我遇到了问题。我该如何处理此类问题?

这是我得到的错误:

<simpleError in do.call(fi$exec, req$args): variable names are limited to 10000 bytes>

如何解决此错误?如何输入块以固定空间限制? 为什么还要将其存储为变量名?

如果输入JSON文件的大小足够小,则api的输入有效。 (约46 KB,甚至更多)。但是无法获得1.3 MB的文件

水管工版本= 0.4.6

R版本= 3.5.2

#' @param req Posts in JSON format
#' @post /model

function(req){
  print("I'm here")
  df <- jsonlite::fromJSON(req$postBody)

  op <- do_something(df)

  return(op)

}

是否有解决此问题的方法?还是有可能解决该问题?

编辑:稍后我写了print语句来检测错误的确切位置。事实证明,在我使用fromJSON函数时,它没有到达函数的第一行。我已经编辑了功能。如果我发送一个小文件,则将执行所有操作并打印print语句,但是对于大文件,它不会显示“我在这里”。

可复制的示例:

temp <- read.csv("https://s3.amazonaws.com/nyc-tlc/trip+data/green_tripdata_2018-01.csv")

input_api_json <- toJSON(temp)

write(input_api_json, file = "input_api_json.json")

然后创建一个createAPI.R文件

 #' @param req Posts in JSON format
#' @post /model

function(req){
  print("I'm here")
  df <- jsonlite::fromJSON(req$postBody)

  op <- df[1,]

  return(op)

}

然后创建一个runAPI.R文件

pr <- plumber::plumb("createAPI.R")
pr$run(port=8000, host="0.0.0.0")

从终端;转到文件夹并运行

curl --data-binary "@input_api_json.json" -X POST http://localhost:8000/model

1 个答案:

答案 0 :(得分:1)

对于我们来说,当我们向Plumber发送最小化的JSON时,会发生此错误。如果打印精美,我们可以轻松发送5万行,但是在1行中没有间距的相同有效负载会遇到所描述的错误。

当然,最小化JSON是机器对机器通信的最佳实践,因此这似乎是框架级的错误[1]。嘿,至少有一种解决方法!

[1] https://github.com/rstudio/plumber/issues/463