了解 SqlAlchemy 中的内存高效迭代
使用 SqlAlchemy 处理 MySQL 中的大型数据集时,内存消耗可能会成为一个问题。如下所示的内置生成器语法可能不如预期的内存效率高:
for thing in session.query(Things): analyze(thing)
底层内存消耗
大多数 DBAPI 实现缓冲行当它们被获取时。这意味着在 SqlAlchemy 检索第一个结果之前,整个结果集可能都在内存中。
查询的默认行为
SqlAlchemy 的 Query 对象通常会加载整个结果集返回对象之前先存入内存。这是由于涉及非平凡 SELECT 语句的查询造成的。但是,Query 提供了“yield_per()”选项来修改此行为。
yield_per()
“yield_per()”选项导致 Query 产生以下行:指定大小的批次。这可以提高内存使用率,但需要谨慎。仅当您不执行任何集合的预先加载时,它才适用。此外,如果 DBAPI 预缓冲行,则内存节省可能会受到限制。
窗口函数方法
“yield_per()”的替代方法是使用窗口函数方法。这涉及预取引用表块的“窗口”值,并发出一次从这些窗口中提取一个的单独的 SELECT 语句。这种方法有助于避免大偏移量时“LIMIT”和“OFFSET”的性能下降。
结论
虽然 SqlAlchemy 的内置生成器很方便,但它们可能并不总是提供最佳的内存效率。了解底层内存消耗并利用“yield_per()”或窗口函数等替代方法可以帮助缓解处理大型数据集时的内存问题。
以上是如何在 SQLAlchemy 中高效地迭代大型数据集而不消耗过多的内存?的详细内容。更多信息请关注PHP中文网其他相关文章!