Django + SQLite3 的内存使用情况
我有一个非常大的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