【问题标题】:RCurl postform taking very long time with large datasetsRCurl postform 需要很长时间才能处理大型数据集
【发布时间】:2023-05-21 11:10:01
【问题描述】:
require(RCurl)
RAW.API <- postForm(REDcap.URL, token=Redcap.token, content="record", 
       type="flat", format="csv", rawOrLabel="Label", 
       .opts=curlOptions(ssl.verifypeer=TRUE, cainfo=REDCap.crt, 
       verbose=FALSE))

data <-   read.table(file = textConnection(RAW.API), header = TRUE, 
          sep = ",", na.strings = "", stringsAsFactors = FALSE)

我正在使用此类代码将数据从 Redcap 提取到 R。问题是在处理我的案例 >19,000 条记录的大型数据集时,它需要花费大量时间,甚至有时会中止。有没有办法增强上面的代码,或者可以用日期对数据进行子集化。

【问题讨论】:

  • 您的示例代码不足以作为reproducible 示例,因为缺少重要变量,我们无法运行相同的代码。我不清楚您是说问题出在http下载还是只是创建data.frame。在读入数据之前不能在 R 中进行过滤;如果您想减少返回的记录数量,请查看您的 Redcap API 是否具有过滤选项。如果没有可重复的示例,我们无法为您提供很多帮助。
  • these slides 中有很多关于与REDCap 接口的信息您是否尝​​试切换到httr 并使用verbose() 选项?由于它是RCurl 之上的一层,因此它具有您需要的所有选项,并且可能更易于调试。另外,您是否从命令行curl 尝试过相同的postForm? (该幻灯片链接上的示例)
  • 还有一个redcapAPI 包,它可能完全解决你所有的问题。

标签: r rcurl redcap


【解决方案1】:

考虑让现有的 R 包之一处理一些低级代码。 REDCapRredcapAPI 都以 data.frame 的形式返回数据。它们是由两个独立的团队开发的,但我们为彼此的软件包做出贡献并经常交流。

关于您的具体情况,我怀疑包裹的“批处理”会对您有所帮助。在幕后,两个包都检索数据的子集,然后将它们附加在一起,然后返回统一的data.frame。目前批处理并没有使整体操作更快,但它大大有助于避免超时

对于一般建议,REDCapR 在CRAN 上有一些小插曲,redcapAPI 有一个wiki

还有什么要补充的吗,@Benjamin

【讨论】:

  • 我认为@wibeasley 可能已正确诊断出您的问题。这是我看到的任何访问 API 的语言都讨论过的问题。 REDCapR 处理这个问题可能比 redcapAPI 好一点,但我使用 redcapAPI 导入了多达 37,000 个主题的数据集。
  • 您也可以尝试导出报告。该报告将执行一个查询,该查询可能会将数据限制在一个足够小的集合中,以便您可以完成导出,但您仍将面临同样的超时风险。您需要使用 REDCap 6.0 或更高版本才能选择此选项。