【发布时间】:2017-10-12 02:18:48
【问题描述】:
我使用 RODBC 向 SQL-Server 发送查询。有时它们运行时间太长,所以我需要取消它们。
单击 RStudio 中的红色“停止”按钮会产生以下错误消息:
R 没有响应您中断处理的请求以便停止 您可能需要完全终止 R 的当前操作。
终止 R 将导致您的 R 会话立即中止。积极的 计算将被中断和未保存的源文件更改和 工作区对象将被丢弃。
你想现在终止 R 吗?
如果我单击“是”,我的会话确实会终止。 (注意:使用 Rgui 代替 RStudio 并不能让事情变得更好)
但是:
-
当我使用另一个软件(名为“Query ExPlus”)连接到同一个 SQL-Server 时,我有一个类似的停止按钮,单击它会立即中断查询,而不会发生任何崩溃。
当我使用 RPostgres 包连接到 PostgreSQL 数据库时,我还可以随时中断查询。
这两点让我觉得应该有办法解决我的问题。我能做什么?
到目前为止,我的解决方法是:
library(RODBC)
library(R.utils)
withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)
注意:我无权从数据库端终止查询。
【问题讨论】:
-
R在等待SQL查询的结果,基本只能在两行代码之间停止R。即使是用 C 语言编写的 R 函数也不能以这种方式被杀死。您可以选择将 SQL 调用包装在 R 脚本中,您将在主脚本的 shell 中运行,将选项设置为在不等待输出的情况下执行。然后在您的主脚本中,您每 10 秒左右发送一个新查询,该查询将检查主查询是否结束,例如通过检查行数或表是否存在。在此代码上,停止按钮将起作用。然后从 R 中运行另一个 CMD 行来终止 SQL 查询。
-
好像你没有最后一步的权限。然后给你的管理员发邮件说你又搞砸了:)。如果您可以将查询分成几个部分,然后在 R 中通过循环运行它们,那么您可以监控您的进度并在任何步骤完全终止该过程。
-
谢谢,这确实是一种可能的方法。我尝试过的类似方法是在 ODBC 连接中使用参数
rows_at_time=1(对于 here Hadley 说,您可以随时停止 RPostgres,因为它一次获取一行)。但这并没有改变任何东西。
标签: sql-server r rodbc