数据库
首页 > 数据库> > mysql – “foreach”循环:使用R中的所有核心(特别是如果我们在foreach循环中发送sql查询)

mysql – “foreach”循环:使用R中的所有核心(特别是如果我们在foreach循环中发送sql查询)

作者:互联网

我打算用“foreach”来uitlize我的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查询?

解决方法:

我的建议如下:
将数据库查询移到循环外部,并锁定访问权限,这样就不会进行并行数据库查询.我认为这也会加快速度,因为你不会有并行磁盘访问,同时仍然可以进行并行处理.

含义(伪代码)
db =连接数据库
threadlock = lock();

parfor {
  threadlock.lock
  result = db query(在此处提取所有数据,因为在加载时无法处理而不保持数据库锁定)
  thread.unlock
  处理结果数据(现在只是数据,而不是sql对象).
}

标签:r,mysql,foreach,multicore
来源: https://codeday.me/bug/20191006/1863204.html