【问题标题】:Memory usage with Django + SQLite3Django + SQLite3 的内存使用情况
【发布时间】: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()

标签: python django sqlite


【解决方案1】:

愚蠢的我,这是在Django FAQ 中解决的。

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

from django import db 
db.reset_queries()

【讨论】:

  • 尽管这次查询缓存 + DEBUG=True 对您有所帮助,但您可能会发现它在未来一轮的调试和/或优化中很有用。查询缓存在django.db.connection.queries
【解决方案2】:

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

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

【讨论】:

  • 一开始我也是这么想的,但是分块还是会导致内存泄漏。与上述情况相比,内存使用情况保持不变。
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2015-03-28
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2012-05-30
相关资源
最近更新 更多