En 2010/03/30 12:01, Chema Cortes escribiu:
El día 26 de marzo de 2010 22:05, damufo<dam...@gmail.com>  escribió:

He cambiado la cadena de conexión y he usado la que me indicas.
Dicha cadena, funciona y se conecta bien.
Lo del consumo de memoria sigue ahí. Anexo una imagen donde tras una hora y
algo de ejecución ya estaba por los 718 MB de consumo (como ya comenté esto
llega as mas de 1,5 Gigas).
Lo siguiente que me queda es hacer cada cierto número de registros una
desconexión de la base de datos y reconectar. Que te parece?
Alguna otra opinión?

Me sigue pareciendo extraño. Sin ver el resto de código no puedo
aventurar dónde se está consumiendo los recursos.

Tengo un caso similar en el que leo cerca de 100.000 registros desde
servidores remotos y que introduzco luego en un postgres local y en un
fichero mdb, no me tarda más de 20 minutos en jython (jdbc:odbc) y no
pasa de los 512Mb de consumo de memoria. Antes lo hacía también con
adodbapi, pero cambié a jdbc cuando empezaron a darme problemas tener
diferentes versiones del cliente de informix. Tal vez podrías probar
con jython, aunque no creo que se note ninguna mejora.

Hola Chema:
Muchas gracias por la ayuda. Anexo el código.

Otra cosa, la base de datos está en access 97.

Por lñas pruebas que tengo hecho cuando se conecta a access 97 a través de jet en lugar de odbc la cosa vá mas rápido. Esto lo recuerdo de cuando usé VB6.

Se acepta cualquier sugerencia sobre el código.




_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/






------
esta es la clase generica para base de datos
------

import sys
import adodbapi


class Base(object):

    def __init__(self):
        pass

    def exec_sql(self, sql, values=None, n=0):
        """
        sql: string sql. values: tuple with values. n: number items to get
        """
        try:
            cursor = self.conexion.cursor()
            tipo = sql.split()[0].lower()
            if tipo == "select":
                if values:
                    if type(values) == tuple:
                        cursor.execute(sql, values[0])
                    else:
                        cursor.execute(sql, values)
                else:
                    cursor.execute(sql)
                if n == 0:
                    return cursor.fetchall()
                else:
                    return cursor.fetchmany(n)
            else:
                log_db = ''
                if values:
#                    j = 0
                    for i in values:
                        try:
                            cursor.execute(sql, i)
#                            j = j + 1
#                            if j > 59:
#                                self.conexion.commit()
#                                j = 0
                        except:
                            print "Error no contemplado:", sys.exc_info()[0]
                            return "err"
                else:
                    try:
                        cursor.execute(sql)
                    except:
                        print "Error no contemplado:", sys.exc_info()[0]
                        return "err"
                self.conexion.commit()
            cursor.close()
        except:
            print "Error no contemplado:", sys.exc_info()[0]
            return "err"

            
-----
A partir de la clase anterior obtengo la base de datos con la conexión a access
-----

import sys
import adodbapi
from base import Base


class Access(Base):

    def __init__(self, path):
        try:
            dsn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;"
#            dsn += "Exclusive=1;User Id=admin;Password=;"
            dsn += "User Id=admin;Password=;"
            dsn = dsn % (path)
#            Suxestión de chema cortes
            dns="Driver={Microsoft Access 
Driver(*.mdb)};Dbq=%s;Exclusive=1;Uid=admin;Pwd=;" % (path)

            self.conexion = adodbapi.connect(dsn)
        except:
            self.conexion = None

    def close_db(self):
        self.conexion.close()

        
        
        
----
Esta es la clase que uso para importar 
----
class ActuTabla(object):

    def __init__(self):
        pass
        
    def conectar_bd(self, path): 
        self.db = DB(path=path)
        
    def desconectar_db(self):
        self.db.close_db()
        
    def import_table(self, table, folder="", last_data_file=None):
        print "Importing table %s" % table
        file_name = '%s%s.sfg' % (folder, table)
        f = None
        try:
            f = open(file_name, 'r')
        except:
            print "File to import not exists."
        if f:    
            current_file = unicode(f.readline()).strip() # get date file
            if last_data_file != current_data_file:
                sql = "DELETE FROM %s" % taboa  # delete current data
                rs = self.db.exec_sql(sql = sql)
                res = []
                for linha in f.readlines():
                    linha = unicode(linha.strip(),'iso-8859-15').split(";")
                    res.append(linha)
                sql = ''.join(("insert into %s values(?" % table, 
                               ",?"  * (len(linha)-1), ")"))
                res = self.db.exec_sql(sql=sql, values=res)
                if res=='err':
                    print "Error to import data"
                f.close()
                importou = current_data_file  # "anything import"
            else:
                importou = False #import nothing
            return importou

            
            
if __name__ == '__main__':
    main = ActuTabla()
    prefs = ConfigParser()
    prefs.read(['prefs.ini'])
    
    path_db = prefs.get("actutable", "path_db") 
    main.conectar_bd(path_db)
    
    import_any = False
    for i in taboas:
        last_data_file = prefs.get('actutable', 'last_%s' % i)
        importou = main.import_table(table=i, folder="", 
last_data_file=last_data_file)
        if importou:
            # establece a ultima data, a data do ficheiro impoertado            
            prefs.set("actutable", "last_%s" % i, importou)
            fp=open("prefs.ini", 'w')
            prefs.write(fp)
            fp.close()
            import_any = True
    main.desconectar_db()
 
 
 El formato del fichero de texto es
 texto;texto;texto;... 32 campos en total una media de 5 caracteres por campo
 
 
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a