我有一个非常大的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