SQLAlchemy 的内置生成器是否提供内存高效迭代?
在使用 SQLAlchemy 时,对数据的相当大部分进行大量查询MySQL表可能会遇到内存消耗过多的情况。尽管假设内置生成器将以小块的形式获取数据,但这个问题仍然存在。为了缓解这种情况,用户求助于创建自定义迭代器。
但是,对 SQLAlchemy 行为的仔细检查表明,大多数 DBAPI 实现都会在检索时缓冲行,从而导致甚至在 SQLAlchemy ORM 处理结果之前就消耗内存。此外,Query 的默认操作是在将对象返回给用户之前完全加载结果集。
对于复杂查询,确保结果的完整性证明了此行为的合理性。但是,对于简单的 SELECT 语句,Query 提供了 Yield_per() 选项来修改此功能,从而可以批量生成行。使用yield_per() 时务必谨慎,因为它需要对应用程序有深入的了解,并且在底层 DBAPI 预缓冲行的情况下效果较差。
更有效的方法是利用窗口函数。通过预取一组代表数据块的“窗口”值,用户可以生成针对特定窗口的单独 SELECT 语句。此方法避免了 OFFSET 和 LIMIT 的限制,这些限制会导致性能随着 OFFSET 值的增加而下降。
为了获得最大效率,请考虑使用 PostgreSQL、Oracle 或 SQL Server,因为这些数据库支持窗口函数。
以上是SQLAlchemy 的 `yield_per()` 是否真正为大型 MySQL 查询提供内存高效的迭代?的详细内容。更多信息请关注PHP中文网其他相关文章!