2010-03-10 95 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