【问题标题】:"foreach" loop : Using all cores in R (especially if we are sending sql queries inside foreach loop)“foreach”循环:使用 R 中的所有核心(尤其是当我们在 foreach 循环中发送 sql 查询时)
【发布时间】: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 中运行脚本

标签: mysql r foreach multicore


【解决方案1】:

我的建议是这样的: 将数据库查询移到循环之外,并锁定访问,这样您就不会进行并行数据库查询。我认为这也会加快速度,因为您将无法访问并行磁盘,同时仍然能够进行并行处理。

含义(伪代码) db = 连接到数据库 线程锁 = lock();

parfor { 线程锁.lock 结果 = db 查询(将所有数据拉到此处,因为在加载时无法在不保持数据库锁定的情况下进行处理) 线程.解锁 处理结果数据(现在只是数据,而不是 sql 对象)。 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2015-07-04
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多