Django + SQLite3 的内存使用情况

3 投票
2 回答
1072 浏览
提问于 2025-04-15 20:15

我有一个非常大的SQLite表,里面有超过50万行数据,大约15列(大部分是浮点数)。我想把这些数据从SQLite数据库转移到一个Django应用程序中(虽然Django可以支持很多种关系型数据库,但我这里用的是Postgres)。一开始一切都很顺利,但随着处理的进行,Python进程的内存使用量每秒钟就会增加2到3兆。我试着在每次循环结束时用'del'来删除EVEMapDenormalize和row对象,但内存占用还是在继续增加。这里有一段代码,大家有什么建议吗?

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()

我并不想把这个SQLite数据库和Django的ORM结合起来。我只是想找到一种方法,把数据转移过来,而不让我的内存用光。

2 个回答

1

我觉得用 select * from mapDenormalize 这个语句把所有结果一次性加载到内存里总是个坏主意。我的建议是,把脚本分成小块来执行。可以用 LIMIT 来分批获取数据。

先获取第一批数据,处理完后再获取下一批,这样可以更有效率。

3

真是傻我了,这个问题在Django的常见问题解答里已经提到过了。

在调试模式下,需要清理数据库查询缓存。

from django import db 
db.reset_queries()

撰写回答