【发布时间】:2014-06-19 14:13:05
【问题描述】:
对于我的论文数据收集,其中一个来源是一个外部管理的系统,它基于用于提交SQL 查询的 Web 表单。使用R 和RCurl,我实现了一个自动化的数据收集框架,我在其中模拟了上述表格。当我限制结果数据集的大小时,一切都运行良好。但是,当我尝试超过 100000 条记录时(下面代码中的RQ_SIZE),串联的“我的代码 - 他们的系统”开始没有响应(“挂起”)。
所以,我决定使用SQL分页功能(LIMIT ... OFFSET ...)提交一系列请求,希望将分页结果组合成目标数据框架。但是,在相应地更改我的代码后,我看到的输出只是一个分页进度字符(*),然后就没有更多的输出了。如果您能帮助我确定意外行为的可能原因,我将不胜感激。我无法提供可重现的示例,因为提取功能非常困难,更不用说数据了,但我希望以下代码 sn-p 足以揭示问题(或者,至少是解决问题的方向) .
# First, retrieve total number of rows for the request
srdaRequestData(queryURL, "COUNT(*)", rq$from, rq$where,
DATA_SEP, ADD_SQL)
assign(dataName, srdaGetData()) # retrieve result
data <- get(dataName)
numRequests <- as.numeric(data) %/% RQ_SIZE + 1
# Now, we can request & retrieve data via SQL pagination
for (i in 1:numRequests) {
# setup SQL pagination
if (rq$where == '') rq$where <- '1=1'
rq$where <- paste(rq$where, 'LIMIT', RQ_SIZE, 'OFFSET', RQ_SIZE*(i-1))
# Submit data request
srdaRequestData(queryURL, rq$select, rq$from, rq$where,
DATA_SEP, ADD_SQL)
assign(dataName, srdaGetData()) # retrieve result
data <- get(dataName)
# some code
# add current data frame to the list
dfList <- c(dfList, data)
if (DEBUG) message("*", appendLF = FALSE)
}
# merge all the result pages' data frames
data <- do.call("rbind", dfList)
# save current data frame to RDS file
saveRDS(data, rdataFile)
【问题讨论】:
-
您好,目前还不清楚是什么问题。具体是什么不起作用?什么让你知道它不起作用。您得到了什么结果,它们与您预期的结果有何不同?
-
@RicardoSaporta:具体来说,问题是脚本变得无响应并且它的执行处于未确定(可能是挂起)状态(正如我所指出的,只打印了第一个
*,而结果包含180 万多条记录)。我将尝试减少 SQL 查询的限制(根据下面 Arthur 的回答),看看它是否有帮助。我在某处读到大约 100K 是 PostgreSQL 分页的边界值(如果我理解正确的话)。我不能使用可滚动游标或 SQL 查询之外的其他东西,因为我没有直接访问系统的权限。
标签: sql r postgresql pagination rcurl