【发布时间】:2010-03-10 14:25:19
【问题描述】:
我有一个非常大的 SQLite 表,其中包含超过 500,000 行和大约 15 列(大部分是浮点数)。我想将数据从 SQLite DB 传输到 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 的情况下传输数据。
【问题讨论】:
-
为什么不直接使用 SQL 插入语句来获取数据呢?否则,您可以通过缓存 objects.get 调用的结果来提高性能,这样您只需查找特定类型一次。
-
我想使用 Django 的 ORM 来确保跨各种数据库引擎的数据完整性。用户可能会在 Django 支持的任何 RDBM 上进行部署。
-
傻瓜,这已在 Django 常见问题解答中得到解决:docs.djangoproject.com/en/dev/faq/models/… 在调试模式下需要清除数据库查询缓存。 from django import db db.reset_queries()