2010-03-10 93 views
3

我有一個非常大的SQLite表,有超過500,000行約15列(主要是浮動)。我想將數據從SQLite數據庫傳輸到Django應用程序(可以由許多RDBM支持,但在我的情況下是Postgres)。一切正常,但隨着迭代的繼續,Python進程的內存使用量每秒跳躍2-3兆。我已經嘗試在每次迭代結束時使用'del'刪除EVEMapDenormalize和row對象,但膨脹仍在繼續。這是一個摘錄,任何想法?Django + SQLite3的內存使用情況

class Importer_mapDenormalize(SQLImporter): 
def run_importer(self, conn): 
    c = conn.cursor() 

    for row in c.execute('select * from mapDenormalize'): 
     mapdenorm, created = EVEMapDenormalize.objects.get_or_create(id=row['itemID']) 
     mapdenorm.x = row['x'] 
     mapdenorm.y = row['y'] 
     mapdenorm.z = row['z'] 

     if row['typeID']: 
      mapdenorm.type = EVEInventoryType.objects.get(id=row['typeID']) 

     if row['groupID']: 
      mapdenorm.group = EVEInventoryGroup.objects.get(id=row['groupID']) 

     if row['solarSystemID']: 
      mapdenorm.solar_system = EVESolarSystem.objects.get(id=row['solarSystemID']) 

     if row['constellationID']: 
      mapdenorm.constellation = EVEConstellation.objects.get(id=row['constellationID']) 

     if row['regionID']: 
      mapdenorm.region = EVERegion.objects.get(id=row['regionID']) 

     mapdenorm.save() 
    c.close() 

我一點也不感興趣用Django ORM包裝這個SQLite數據庫。我真的很想弄清楚如何在不吮吸我所有RAM的情況下傳輸數據。

+0

爲什麼不直接使用直接的SQL插入語句來獲取數據呢?否則,您可以通過緩存objects.get調用的結果來提高性能,以便只查找特定類型一次。 – Tom 2010-03-10 14:31:21

+0

我想使用Django的ORM來確保跨多種數據庫引擎的數據完整性。用戶可能會部署在Django支持的任何RDBM上。 – Greg 2010-03-10 15:05:45

+0

愚蠢的我,這是在Django常見問題: http://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory 需要清除DB查詢緩存而在DEBUG模式下。 from django import db db.reset_queries() – Greg 2010-03-10 15:38:11

回答

3

傻我,這是在Django FAQ解決。

需要在DEBUG模式下清除DB查詢緩存。

from django import db 
db.reset_queries() 
+0

即使查詢緩存+ DEBUG = True這一次,您可能會發現它在未來一輪的調試和/或優化中很有用。查詢緩存在'django.db.connection.queries'中。 – istruble 2010-03-10 16:10:58

1

我認爲一個select * from mapDenormalize並將結果加載到內存將永遠是一個壞主意。我的建議是 - 將腳本分成塊。使用LIMIT分段獲取數據。

獲取第一部分,使用它,接近光標,然後獲取下一部分。

+0

我一開始也這樣認爲,但分塊後仍然導致內存泄漏。內存使用情況與上述情況保持一致。 – Greg 2010-03-10 15:02:54