Django + SQLite3的内存使用情况

时间:2010-03-10 14:25:20

标签: python django sqlite

我有一个非常大的SQLite表,超过500,000行,大约有15列(大多数是浮点数)。我想将数据从SQLite数据库传输到Django应用程序(可以由许多RDBM支持,但在我的情况下是Postgres)。一切正常,但随着迭代的继续,Python进程的内存使用量每秒跳跃2-3兆。我尝试使用'del'在每次迭代结束时删除EVEMapDenormalize和行对象,但膨胀继续。这是一个摘录,任何想法?

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 DB。我真的很想知道如何在不吸收所有RAM的情况下传输数据。

2 个答案:

答案 0 :(得分:3)

愚蠢的我,Django FAQ已解决了这个问题。

在DEBUG模式下需要清除数据库查询缓存。

from django import db 
db.reset_queries()

答案 1 :(得分:1)

我认为select * from mapDenormalize并将结果加载到内存中总是一个坏主意。我的建议是 - 将脚本传播到块中。使用LIMIT分段获取数据。

获取第一部分,使用它,接近光标,然后获取下一部分。