2011-04-05 3 views
2

Mon programme est en train d'aspirer un meg toutes les quelques secondes. J'ai lu que python ne voit pas les curies dans la collecte des ordures, donc j'ai le sentiment que je pourrais faire quelque chose de mal avec mon utilisation de pydbc et sqlalchemy et peut-être ne pas fermer quelque chose quelque part?SQLAlchemy Mauvaise utilisation provoquant une fuite de mémoire?

#Set up SQL Connection 
def connect(): 
     conn_string = 'DRIVER={FreeTDS};Server=...;Database=...;UID=...;PWD=...' 
     return pyodbc.connect(conn_string) 

metadata = MetaData() 
e = create_engine('mssql://', creator=connect) 
c = e.connect() 
metadata.bind = c 
log_table = Table('Log', metadata, autoload=True) 

... 
atexit.register(cleanup) 
#Core Loop 
line_c = 0 
inserts = [] 
insert_size = 2000 
while True: 
     #line = sys.stdin.readline() 
     line = reader.readline() 
     line_c +=1 
     m = line_regex.match(line) 
     if m: 
       fields = m.groupdict() 
       ... 
       inserts.append(fields) 
       if line_c >= insert_size: 
         c.execute(log_table.insert(), inserts) 
         line_c = 0 
         inserts = [] 

Dois-je passer peut-être le bloc de métadonnées ou d'une partie de celui-ci au bloc d'insertion et fermer la connexion chaque insert?

Édition:
Q: Est-ce que tout se stabilise? enter image description here

A: Seulement si vous comptez Linux soufflant loin :-) processus (graphique n'exclut buffers/cache d'utilisation de la mémoire)

+0

Est-ce que ça se stabilise jamais? SQLA stocke certaines références aux objets: voir "La session est-elle un cache?" section dans http://www.sqlalchemy.org/docs/orm/session.html#frequently-asked-questions. Si votre utilisation de la mémoire se termine éventuellement, il se peut que SQLA stocke un tas de références d'objets pour une utilisation ultérieure. –

+0

@KirkStrauser: Ne semble pas, voir mise à jour. –

+0

Est-ce que commenter la ligne 'c.execute' résout le problème? Je parie que ce sera le cas, mais je me demandais si vous en étiez certain. Est-ce que le pilote FreeTDS a besoin de commit() pour vider les données de sa transaction? –

Répondre

1

Je blâme pas nécessairement SQLAlchemy. Cela pourrait aussi être un problème du pilote sous-jacent. En général, les fuites de mémoire sont difficiles à détecter. En tout cas vous devriez demander sur la liste de diffusion SQLALchemy où le développeur de base Michael Bayer répond sur presque chaque question ... peut-être une meilleure chance d'obtenir une aide réelle là-bas ...

Questions connexes