了解 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中文網其他相關文章!