2014-12-07 215 views
0

我正在使用以下代碼插入超過1M的條目在一個SQL表中(ItemOrderType位是因爲我認爲我從其他來源寫入條目時發生錯誤使用的SQLAlchemy的DECL枚舉食譜...)SQLAlchemy - 插入> 1M行 - 進程死亡

def run_import(): 
    with open('listings.csv', 'r') as csv_file: 
     reader = csv.reader(csv_file, delimiter=";") 
     inserts = [] 
     for row in reader: 
      inserts.append({'item_id': int(row[0]), 
          'order_type': ItemOrderType.from_string(row[1].replace('<','').replace('>','')), 
          'listings': int(row[2]), 
          'unit_price': int(row[3]), 
          'quantity': int(row[4])}) 

      if len(inserts) == 10000: 
       db.engine.execute(ItemOrder.__table__.insert(), inserts) 
       inserts = [] 
     db.engine.execute(ItemOrder.__table__.insert(), inserts) 

無論哪種方式,而不LEN(插入)絕招,刀片甚至不會發生,過程只是返回消息「封殺」。有了它,我在死亡前獲得了大約750,000條記錄。

當監控最高級別的進程時,我發現VIRT內存在死亡前上升到1200米左右,res停留在230米左右。

這是sqlalchemy泄漏嗎?我會假設在引擎執行插入之後,所使用的所有內存都是釋放的?這個是我在Archlinux上使用的Python版本: Python 2.7.6(默認,2014年5月26日,10:25:14) [GCC 4.4.7 20120313(Red Hat 4.4.7-4) ] on linux2

在此先感謝!

回答

0

我似乎自己解決了它。我沒有提到,我正在運行燒瓶與sqlalchemy連接,並且燒瓶本身以調試模式運行,這似乎阻止數據,導致內存耗盡。