4

我需要从 PostgreSQL 数据库中读取和连接很多行(~500k)并将它们写入 MySQL 数据库。

我天真的方法看起来像这样

    entrys = Entry.query.yield_per(500)

    for entry in entrys:
        for location in entry.locations:
            mysql_location = MySQLLocation(entry.url)
            mysql_location.id = location.id
            mysql_location.entry_id = entry.id

            [...]

            mysql_location.city = location.city.name
            mysql_location.county = location.county.name
            mysql_location.state = location.state.name
            mysql_location.country = location.country.name

            db.session.add(mysql_location)

    db.session.commit()

每个Entry大约有 1 到 100 个Locations

这个脚本现在运行了大约 20 个小时,并且已经消耗了 > 4GB 的内存,因为所有内容都保存在内存中,直到会话提交。

通过我之前提交的尝试,我遇到了这样的问题

如何提高查询性能?它需要变得更快,因为在接下来的几个月中行数将增长到大约 2500k。

4

1 回答 1

1

由于您已经知道的原因,您的幼稚方法是有缺陷的 - 吃掉您的内存的东西是在内存中等待刷新到 mysql 的模型对象。

最简单的方法是根本不使用 ORM 进行转换操作。直接使用 SQLAlchemy 表对象,因为它们也快得多。

此外,您可以做的是创建 2 个会话,并将 2 个引擎绑定到单独的会话中!然后您可以为每个批次提交 mysql 会话。

于 2013-08-02T10:49:27.120 回答