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?
A: Seulement si vous comptez Linux soufflant loin :-) processus (graphique n'exclut buffers/cache d'utilisation de la mémoire)
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. –
@KirkStrauser: Ne semble pas, voir mise à jour. –
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? –