Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Visual Basic clásico (http://www.forosdelweb.com/f69/)
-   -   Gasto alto en memoria atacando bases mysql y archivo texto (http://www.forosdelweb.com/f69/gasto-alto-memoria-atacando-bases-mysql-archivo-texto-528303/)

mmanzano 25/10/2007 03:13

Gasto alto en memoria atacando bases mysql y archivo texto
 
Hola:

He realizado un programa en visual basic que crea 4 recordsets a una base de datos mysql a través de un dsn para escribir en ellas. Las conexiones son del tipo:

Código:

Set CONEXION = New Connection
CONEXION.CursorLocation = adUseClient
CONEXION.Open "DSN=nombre;uid=usuario;pwd=password;"

Dim REC1 As ADODB.Recordset
Set REC1 = New Recordset
REC1.Open "tabla1", CONEXION, adOpenStatic, adLockOptimistic

Tengo la sensación de que algo falla al abrir las conexiones ya que cuando se abren el sistema pide más memoria. Llega a usar aproximadamente 1'5 GB de maemoria (haciendo uso de la memoria virtual, claro).

El proceso que sigue a esto es copiar un fichero de más de 100 MB en otro con la instruccion FileCopy. Una vez hecho esto se procesa leyendo linea a linea con Line Input #log, linea e incorporando los datos en la base de datos.

No sé si estoy haciendo algo mal pues me parece excesivo el uso de memoria. Si no veís nada raro hasta aquí puedo daros más información.

Laforge 25/10/2007 08:06

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
... no será que esa tabla que abres con el RS es ENORME? Yo utilizo conexiones a BDD MySQL externas (no uso DSN, sino que apunto directo a la dirección del server) y nunca he tenido más problema que el que puedas tener al realizar consultas a una BDD de más de 3Gb..... vamos que tarda un poco en realizar la consulta, pero nada más....

mmanzano 25/10/2007 15:04

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Mis bases de datos ahora ocupan mucho espacio pero el programa siempre ha tirado de mucha memoria aún cuando no tenían nada o casi nada las tablas. Lo digo por que a veces falla y tengo que estar a mano viendo el problema. Y claro cuando lanzo el programa a ejecutarse para hacer pruebas mi ordenador se queda inutilizable.

mmanzano 26/10/2007 01:19

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
A ver, he echado un vistazo a las bases de datos y tengo en total unos 14 campos varchar de 200 caracteres. ¿Puede influir esto en el gasto de memoria?

Un saludo.

ReViJa 27/10/2007 03:37

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Todo influye a la hora de consumir recursos, no es lo mismo un campo Byte que un campo VarChar(200) pero no creo que sea ese tu problema.

Pero como comenta el compañero Laforge si la tabla es muy grande y los campos no están bien estructurados la consulta puede demorarse algunos segundos pero no desesperes y si puedes no cargues toda la tabla, carga solo lo que necesite el usuario.

Tampoco pones mucho code para que veamos si la carga es correcta desde el principio de la aplicación.

Un saludo.

GeoAvila 29/10/2007 11:49

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Cita:

Iniciado por mmanzano (Mensaje 2166996)
Hola:

He realizado un programa en visual basic que crea 4 recordsets a una base de datos mysql a través de un dsn para escribir en ellas. Las conexiones son del tipo:

Código:

Set CONEXION = New Connection
CONEXION.CursorLocation = adUseClient
CONEXION.Open "DSN=nombre;uid=usuario;pwd=password;"

Dim REC1 As ADODB.Recordset
Set REC1 = New Recordset
REC1.Open "tabla1", CONEXION, adOpenStatic, adLockOptimistic

Tengo la sensación de que algo falla al abrir las conexiones ya que cuando se abren el sistema pide más memoria. Llega a usar aproximadamente 1'5 GB de maemoria (haciendo uso de la memoria virtual, claro).

El proceso que sigue a esto es copiar un fichero de más de 100 MB en otro con la instruccion FileCopy. Una vez hecho esto se procesa leyendo linea a linea con Line Input #log, linea e incorporando los datos en la base de datos.

No sé si estoy haciendo algo mal pues me parece excesivo el uso de memoria. Si no veís nada raro hasta aquí puedo daros más información.

En lo personal lo que yo haría es colocar un top a la consulta para poder obtener únicamente el numero de registros al abrir la tabla, para que esto no te devuelva la data en bruto, también algo que debes de hacer es quitar los campos que no usas.

por ejemplo

Select top 10 id_empleado,nombre_empleado from Tbl_empleados

haciendo una consulta un tanto mucho más rápida que la inicial, y para guardar no tenes la necesidad de abrir un recordset lo podes hacer directamente desde la conexión de la base de datos..

Db.execute "Insert into Tbl_empleados values(100,'Juan Perez')"

nos vemos..

mmanzano 30/10/2007 04:11

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Me parece que poco a poco voy teniendo las cosas más claras. La verdad es que no había pensado en todo lo que estaís argumentando pero tiene bastante sentido.

Por ahí arriba me han pedido que coloque más código para ver que puede estar fallando:

Para insertar uso:

Código:

tabla1_rec.AddNew
tabla1_rec!fecha = fecha(cortarcampo(linea, ",", 1))
tabla1_rec!hora = hora(cortarcampo(linea, ",", 1))
tabla1_rec!local = cortarcampo(linea, ",", 2)
tabla1_rec!idlog = cortarcampo(linea, ",", 7)
tabla1_rec!serie = cortarcampo(linea, ",", 11)
tabla1_rec!iporigen = cortarcampo(linea, ",", 14)
tabla1_rec!puertoorigen = cortarcampo(linea, ",", 15)
tabla1_rec!ipdestino = cortarcampo(linea, ",", 16)
tabla1_rec!puertodestino = cortarcampo(linea, ",", 17)
tabla1_rec!idcat = 0
tabla1_rec!categoria = "Filtrado manual"
tabla1_rec!dominio = cortarcampo(linea, ",", 19)
tabla1_rec!estado = cortarcampo(linea, ",", 21)
tabla1_rec!mensaje = cortarcampo(linea, ",", 22)
tabla1_rec.Update

Por eso veo díficil usar un inser into aunque no descabellado, es más lo considero una buena idea.

Un saludo.

GeoAvila 30/10/2007 11:02

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Cita:

Iniciado por mmanzano (Mensaje 2171528)
Me parece que poco a poco voy teniendo las cosas más claras. La verdad es que no había pensado en todo lo que estaís argumentando pero tiene bastante sentido.

Por ahí arriba me han pedido que coloque más código para ver que puede estar fallando:

Para insertar uso:

Código:

tabla1_rec.AddNew
tabla1_rec!fecha = fecha(cortarcampo(linea, ",", 1))
tabla1_rec!hora = hora(cortarcampo(linea, ",", 1))
tabla1_rec!local = cortarcampo(linea, ",", 2)
tabla1_rec!idlog = cortarcampo(linea, ",", 7)
tabla1_rec!serie = cortarcampo(linea, ",", 11)
tabla1_rec!iporigen = cortarcampo(linea, ",", 14)
tabla1_rec!puertoorigen = cortarcampo(linea, ",", 15)
tabla1_rec!ipdestino = cortarcampo(linea, ",", 16)
tabla1_rec!puertodestino = cortarcampo(linea, ",", 17)
tabla1_rec!idcat = 0
tabla1_rec!categoria = "Filtrado manual"
tabla1_rec!dominio = cortarcampo(linea, ",", 19)
tabla1_rec!estado = cortarcampo(linea, ",", 21)
tabla1_rec!mensaje = cortarcampo(linea, ",", 22)
tabla1_rec.Update

Por eso veo díficil usar un inser into aunque no descabellado, es más lo considero una buena idea.

Un saludo.

justamente así lo hacía yo.. en una aplicación, y lo cambié al insert into y me funciónó de mil maravillas...

pero lo podes hacer como te describí arriba..

nos vemos..

ReViJa 30/10/2007 12:21

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
Pues yo lo recomiendo encarecidamente ya que la velocidad es incomparable.

Un saludo.

mmanzano 30/10/2007 15:39

Re: Gasto alto en memoria atacando bases mysql y archivo texto
 
pues tomo nota.... intentaré hacerlo así cuando tenga ratos libres XD

Muchisimas gracias por vuestra ayuda. Me da cosa no haber colaborado con respuestas en otros foros pero es que son mogollón de mensajes al cabo del dia... creo que lo mejor será buscar un foro donde me adapte bien e intentar ayudar en ese foro sólo.

Lo intentaré.


La zona horaria es GMT -6. Ahora son las 10:35.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.