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/