我有一个非常大的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的情况下传输数据。
答案 0 :(得分:3)
答案 1 :(得分:1)
我认为select * from mapDenormalize
并将结果加载到内存中总是一个坏主意。我的建议是 - 将脚本传播到块中。使用LIMIT
分段获取数据。
获取第一部分,使用它,接近光标,然后获取下一部分。