【发布时间】:2011-06-20 05:40:43
【问题描述】:
我打算使用“foreach”来利用我 CPU 中的所有内核。问题是我需要在循环内发送一个 sql 查询。该脚本在正常的“for”循环中运行良好,但是当我将其更改为“foreach”时出现以下错误。 错误是:
select: Interrupted system call
select: Interrupted system call
select: Interrupted system call
Error in { : task 1 failed - "expired MySQLConnection"
我使用的代码是:
library(foreach)
library(doMC)
library(RMySQL)
library(multicore)
registerDoMC(cores=6)
m <- dbDriver("MySQL", max.con = 100)
con <- dbConnect(m, user="*****", password = "******", host ="**.**.***",dbname="dbname")
list<-dbListTables(con)
foreach(i = 1:(length(list))%dopar%{
query<-paste("SELECT * FROM ",list[i]," WHERE `CLOSE` BETWEEN 1 AND 100",sep="")
t<-dbGetQuery(con,query)
}
虽然“foreach”在我的系统中用于所有其他目的都可以正常工作,但仅在 sql 查询的情况下才会出错。有没有办法在“foreach”循环中发送 sql 查询?
【问题讨论】:
-
此评论与您的问题无关:使用四个核心在一个数据库上进行查询不会使数据库本身更快。如果数据库是瓶颈,那么找到一种更快(并行)的方式来触发查询不会更快地获得结果。也许你已经这样做了,但你应该找到一种方法来确定数据库是否会在浪费时间线程化查询之前跟上。
-
David0 是对的。使用多个内核可以加快处理器绑定任务的速度,但数据库查询很少能满足要求。
-
感谢您的 cmets。但是,我不会使用“foreach”循环结构来加速数据库查询。我将需要多个内核来加快查询结果的运算速度。我没有在上面包含该代码,因为“foreach”本身在 SQL 查询中失败。
-
@rajesh - 看起来您对所有查询都使用相同的数据库连接。你应该在循环中打开和关闭一个唯一的连接吗?
-
谢谢理查德。有效。显然,驱动程序和连接都需要在循环内启动。我仍然收到上面提到的警告消息“选择:中断的系统调用”,没有任何错误消息。如果它与内核有关,仅供参考:我在 Ubuntu 10.04 中运行脚本