2011-04-05 34 views
2

我的程序每隔幾秒就會吸取一次meg。我讀過python在垃圾回收中沒有看到curors,所以我有一種感覺,我可能會在使用pydbcsqlalchemy時出錯,並且可能不會關閉某些東西?SQLAlchemy濫用導致內存泄漏?

#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 = [] 

我是否應該將元數據塊或其中的一部分移動到插入塊並關閉每個插入的連接?

編輯:
問:它的每一個穩定? enter image description here

答:只有當你算的Linux吹走過程:-)(圖並從內存使用排除緩衝器/高速緩存)

+0

它會不會穩定下來? SQLA確實存儲了一些對象的引用:請參閱「會話是否是緩存?」部分在http://www.sqlalchemy.org/docs/orm/session.html#frequently-asked-questions。如果你的內存使用最終會消失,它可能只是SQLA存儲一堆對象引用以備後用。 – 2011-04-05 14:02:32

+0

@KirkStrauser:似乎沒有,請參閱更新。 – 2011-04-05 14:23:39

+0

評論'c.execute'行解決了這個問題?我敢打賭,但是想知道你是否確定。 FreeTDS驅動程序是否需要您提交()才能從其事務中清除數據? – 2011-04-05 14:45:18

回答

1

我不一定會責怪SQLAlchemy的。這也可能是下層司機的問題。一般來說,內存泄漏很難檢測到。無論如何,您應該在SQLALchemy郵件列表上詢問核心開發人員Michael Bayer在幾乎所有的問題上都會回覆 ......或許更有可能在那裏獲得真正的幫助......