Цикл "foreach": использование всех ядер в R (особенно если мы отправляем sql запросы внутри цикла foreach) - PullRequest
4 голосов
/ 20 июня 2011

Я намерен использовать «foreach» для использования всех ядер в моем процессоре.Подвох в том, что мне нужно отправить запрос 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 запросов.Есть ли способ отправить sql запросы внутри цикла 'foreach'?

1 Ответ

0 голосов
/ 14 декабря 2011

Мое предложение таково: Переместите запросы к базе данных за пределы цикла и заблокируйте доступ, чтобы не выполнять параллельные запросы к базе данных. Я думаю, что это тоже ускорит процесс, поскольку у вас не будет доступа к параллельному диску, но вы все равно сможете выполнять параллельную обработку.

Значение (псевдокод) db = подключиться к базе данных threadlock = lock ();

parfor { threadlock.lock result = db query (извлеките все данные здесь, поскольку вы не можете обрабатывать их во время загрузки, не блокируя базу данных) thread.unlock обрабатывать результирующие данные (которые теперь являются просто данными, а не объектом sql). }

...