[Python-es] Actualizar base de datos msaccess

Chema Cortes py en ch3m4.org
Jue Mar 25 03:19:46 CET 2010


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:

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.


> 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.*




Más información sobre la lista de distribución Python-es