foreach% dopar% + RPostgreSQL

Я использую RPostgreSQL для подключения к локальной базе данных. Настройка отлично работает на моей Linux-машине. R 2.11.1, Postgres 8.4.

Я играл с foreach с многоядерным (doMC) параллельным бэкэндом, чтобы обернуть несколько повторяющихся запросов (насчитывающих несколько тысяч) и добавить результаты в структуру данных. Как ни странно, он работает, если я использую% do%, но не работает, когда я переключаюсь на% dopar%, за исключением случая, когда есть только одна итерация (как показано ниже)

. Мне было интересно, связано ли это с одним подключением объект, поэтому я создал 10 объектов подключения, и в зависимости от того, что было «i», для этого запроса был задан определенный объект con, в зависимости от i по модулю 10. (обозначенный ниже только двумя объектами подключения). Выражение, которое вычисляется eval (expr.01), содержит / - это запрос, который зависит от того, что такое «i».

Я не могу понять эти конкретные сообщения об ошибках. Мне интересно, есть ли способ заставить эту работу работать.

Спасибо.
Vishal Belsare

R-фрагмент следует:

> id.qed2.foreach <- foreach(i = 1588:1588, .inorder=FALSE) %dopar% { 
+ if (i %% 2 == 0) {con <- con0}; 
+ if (i %% 2 == 1) {con <- con1}; 
+ fetch(dbSendQuery(con,eval(expr.01)),n=-1)$idreuters};
> id.qed2.foreach
[[1]]
  [1]   411   414  2140  2406  4490  4507  4519  4570  4571  4572  4703  4731
[109] 48765 84312 91797

> id.qed2.foreach <- foreach(i = 1588:1589, .inorder=FALSE) %dopar% { 
+ if (i %% 2 == 0) {con <- con0}; 
+ if (i %% 2 == 1) {con <- con1}; 
+ fetch(dbSendQuery(con,eval(expr.01)),n=-1)$idreuters};
Error in stop(paste("expired", class(con))) : 
  no function to return from, jumping to top level
Error in stop(paste("expired", class(con))) : 
  no function to return from, jumping to top level
Error in { : 
  task 1 failed - "error in evaluating the argument 'res' in selecting a method for function 'fetch'"
> 

EDIT: Я изменил несколько вещей (все еще безуспешно), но некоторые вещи обнаруживаются. Объекты подключения, созданные в цикле, а не «отключенные» через dbDisconnect, приводят к зависанию подключений, что видно из / var / log для Postgres. Когда я делаю это, появляется несколько новых сообщений об ошибках:

> system.time(
+ id.qed2.foreach <- foreach(i = 1588:1590, .inorder=FALSE, 
.packages=c("DBI", "RPostgreSQL")) %dopar% {drv0 <- dbDriver("PostgreSQL"); 
con0 <- dbConnect(drv0, dbname='nseindia');
list(idreuters=fetch(dbSendQuery(con0,eval(expr.01)),n=-1)$idreuters);
dbDisconnect(con0)})
Error in postgresqlExecStatement(conn, statement, ...) : 
  no function to return from, jumping to top level
Error in postgresqlExecStatement(conn, statement, ...) : 
  no function to return from, jumping to top level
Error in postgresqlExecStatement(conn, statement, ...) : 
  no function to return from, jumping to top level
Error in { : 
  task 1 failed - "error in evaluating the argument 'res' in selecting a method for function 'fetch'"
7
задан Milen A. Radev 11 October 2010 в 18:16
поделиться