Hola:

Vuelvo a la carga con algo que resolv� hace a�os y que ahora me ha dejado de 
funcionar y no consigo arreglar. A ver si alguien me sugiere alg�n enfoque o 
directamente la solucion.

Utilizo R en muchos procesos ETL y la cuesti�n es que me encuentro con que 
tengo que hacer inserts en un BBDD de SQL  Server  de varios miles (a veces 
millones de registros) que mientras R las realiza parece que no est� haciendo 
nada.

La soluci�n que consegu� hacer en su momento fue paralelizar el proceso de 
inserci�n en dos procesos distintos usando el paquete snowfall.
-Un proceso se encargaba de la propia inserci�n de los datos.
-El otro proceso mostraba una barra de progreso que se constru�a consultando la 
tabla (tab) donde se insertaban los registros (datos) para monitorizar su 
proceso.

La subida al servidor es esta funci�n:

subida <- function( datos, tab)
                               {
                                               flush.console()
                                               canal2 <- odbcDriverConnect( 
"case=nochange; Driver=xxx; Server=xxx; Database=xxx; uid=xxx; pwd=xxx; 
wsid=xxx;")
                                               sqlSave(canal2,datos,tablename= 
tab, rownames = FALSE, append=TRUE, fast=TRUE )
                                               close(canal2)
                                               rm(canal2)
                               }

La barra de progreso se toma de esta funci�n:
pb <-function( datos,tab){
                ##Creamos canal de conexion a BBDD
                canal1 <- odbcDriverConnect( "case=nochange; Driver=SQL Server; 
Server=xxx; Database=xxx; uid=xxx; pwd=xx; wsid=ESMADN1003;;")

                ##Obtenemos conteos de registros##################
                #Numero de registro que se van a cargar
                asubir <- as.numeric(nrow(datos))

                #Numero de registro que ya hay en la tabla
                entabla <- as.numeric(sqlQuery(canal1,paste("SELECT Count(*) ", 
" FROM ",tab, sep="")))

                #Numero de registros cargados en el momento n
                total <- as.numeric(0)

#Frecuenca de actualizacion de la barra
  frec <- 0.1

  ##Creamos barra de progreso
  barra <- winProgressBar(title="Subiendo datos a SQL ", label = "Subido el:  
", min= 0, max= 1,initial= 0, width = 800)

                ##Mientras los registros que quedan por subir sean inferiores a 
los que actualmente hay en la tabla se muestra la barra
                while ( entabla + asubir > total  )
                                 {
                                               #Reconectamos
                                               canal1 <- odbcReConnect(canal1)

                                               #Obtenemos registros actuales en 
la tabla (los que habia + los que han subido hasta el momento)
                                               total <- 
as.numeric(sqlQuery(canal1,paste("SELECT Count(*) FROM ",tab, sep="")))

                                               #Calculamos porcentaje de 
registros subidos en el momento
                                               porcen <- as.numeric((total - 
entabla) / asubir)

                                               #Actualizamos barra de progreso
                                               setWinProgressBar(barra, 
porcen,title="SUBIENDO DATOS A SQL", label =paste("Subido el:  ", round(porcen 
*100,0), "% de los datos. Quedan por subir ",(entabla + asubir)-total, " 
registros de ", asubir, "." , sep=""))

                                               #Actualizamos consola
                                               flush.console()
                                               Sys.sleep(frec)
                                 }
                close(barra)
}

Ahora estoy intentando usar el paquete parallel (en lugar de snowfall que ya no 
me funciona) haciendo esto.
library(parallel)
library(RODBC)

##Creo un cluster con dos nodos
cl <-makeCluster(2)

##Exporto datos y funciones a los dos cluster
clusterExport(cl,varlist=c("pb","subida","datos","tab"))

##En el primer cluster hago la inserci�n en el segundo la barra de progreso
clusterApply(cl,subida(datos,tab),pb(datos,tab) )


La inserci�n la realiza correctamente pero la barra de progreso no aparece por 
ning�n lado :( y en el monitor de procesos aparecen dos Rscript.exe corriendo 
(uso Windows 7)

Si alguien quiere que le proporcione la funci�n que constru� usando snowfall (y 
que ahora tampoco muestra la barra) se la puedo enviar para destriparla.

Muchas gracias

Un saludo


Jos� Luis Gilsanz G�mez
Estad�stica
Departamento T�cnico Entidades Financieras
JLL Valoraciones S.A. (Jones Lang LaSalle Espa�a S.A.)
Paseo de la Castellana 130 - 1�; 28046 Madrid
Tel: +34 91 454 96 94
Fax +34 91 541 42 64
jll.es

S�guenos en: Twitter<https://twitter.com/JLLSpain> I 
Linkedin<https://www.linkedin.com/profile/view?id=173156047&trk=nav_responsive_tab_profile>
 I Youtube<https://www.youtube.com/user/joneslanglasallesp> I 
Blog<http://www.jllinmuebles.es/elblogdelosanillos/>
PPiense en el medio ambiente antes de imprimir este e-mail

Los datos personales que en esta comunicaci�n aparecen, as� como los que 
nuestra empresa mantiene de Vd. y de su empresa, son tratados con la finalidad 
de mantener el contacto as� como realizar las gestiones que en esta aparecen 
(Ley Org�nica 15/1999, de 13 de diciembre, de Protecci�n de Datos de Car�cter 
Personal).
Puede ejercer sus derechos de acceso, rectificaci�n, cancelaci�n y oposici�n 
dirigi�ndose a 
[email protected]<mailto:[email protected]>.
La utilizaci�n de su direcci�n de correo electr�nico por parte de nuestra 
empresa queda sujeta a las disposiciones de la Ley 34/2002, de Servicios de la 
Sociedad de la Informaci�n y el Comercio Electr�nico. Si Vd. recibe 
comunicaci�n comercial por nuestra parte y desea dejar de recibirla, rogamos 
nos lo comunique por v�a electr�nica a trav�s de la direcci�n 
[email protected] 
<mailto:[email protected]> .


JLL Valoraciones
Registration number: A-28/806222.
Registered Office: P� de la Castellana, 130 - 1� ; 28046 Madrid

This e-mail is for the use of the intended recipient(s) only. If you have 
received this e-mail in error, please notify the sender immediately and then 
delete it. If you are not the intended recipient, you must not use, disclose or 
distribute this e-mail without the author's prior permission. We have taken 
precautions to minimise the risk of transmitting software viruses, but we 
advise you to carry out your own virus checks on any attachment to this 
message. We cannot accept liability for any loss or damage caused by software 
viruses. If you are the intended recipient and you do not wish to receive 
similar electronic messages from us in future then please respond to the sender 
to this effect

        [[alternative HTML version deleted]]

_______________________________________________
R-help-es mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-help-es

Responder a