我有一個非常大的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的情況下傳輸數據。
爲什麼不直接使用直接的SQL插入語句來獲取數據呢?否則,您可以通過緩存objects.get調用的結果來提高性能,以便只查找特定類型一次。 – Tom 2010-03-10 14:31:21
我想使用Django的ORM來確保跨多種數據庫引擎的數據完整性。用戶可能會部署在Django支持的任何RDBM上。 – Greg 2010-03-10 15:05:45
愚蠢的我,這是在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