Hola Chema:
En 2010/03/25 03:19, Chema Cortes escribiu:
On 24/03/10 22:56, damufo wrote:
Hola:
Estoy tratando de volcar una serie de registros a una base de datos de
access 97. son sobre 90.000
Una vez hecha la conexión
Los valores los introduzco en la variable values
for i in values:
cursor.execute(sql, i)
j = j + 1
if j> 100:
self.conexion.commit()
j = 1
Supongamos que 'i' sea una tupla (o al menos una secuencia) y que sql
sea una query DML de inserción:
Si así es
Para ser precisos, estás accediendo a la base de datos con el motor Jet,
que no tiene transacciones. El commit() no hace nada, todo funcionará
como si tuviera activado el autocommit.
Pues ahí debe estar la cuestión, el commit funciona, si pongo el commit
y accedo a la base de datos veo en la tabla afectada como los registros
se van insertando a medida que va haciendo el commit, si no pongo el
commit, no veo nada hasta que hace el commit final y aparecen todo de
repente.
La cosa tarda mucho, he probado a lanzar un commit cada 100 registros
pero nada, tarda varia horas.
El caso es que el proceso llega a consumir 1,5 gigas de memoria ram.
Te podría recomendar una alternativa usando execute_many, pero de mi
experiencia con adodbapi te adelanto que no sirve de nada. Equivale a
realizar "executes" individuales.
Es extraño tanto consumo de memoria. No puede ser ni por adodbapi ni por
el fragmento de código que has puesto. Trata de convertir la lista
'values' a un iterador o similar para que no sea necesario tener
cargados los 90.000 registros en memoria.
*Lo que seguro que te ayuda mucho es si abres la base de datos en modo
exclusivo. Basta que añadas ";Exclusive=1" a tu cadena DSN.*
Mi cadena DSN es:
dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"
dsn += "User Id=admin;Password=;"
dsn = dsn % (path)
self.conexion = adodbapi.connect(dsn)
donde path es la ruta de la base de datos .mdb
He cambiado la cadena de conexión añadiendo el Exclusive:
dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"
dsn += "Exclusive=1;User Id=admin;Password=;"
dsn = dsn % (path)
self.conexion = adodbapi.connect(dsn)
Al añadirlo, aparece el siguiente error:
DatabaseError: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET
Database Engine', u'Could not find installable ISAM.', None, 5003170,
-2147467259), None)
Si le quito el Exclusive=1 conecta sin problemas.
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/