2012-05-24 44 views
3

我有一個SQLAlchemy ORM模型,用於將特定行(完整對象圖)從我們的生產數據庫傳輸到我們的測試和開發數據庫。這工作得很好,直到我收到一個有很多孩子依賴的集合,並且我碰到了一個MemoryError。我已經在對象層次結構中的關鍵點設置了動態加載,並分別使用不同的查詢加載子元素,但仍有一些集合具有足夠的子數據,這些數據正在運行到內存問題中。高效地迭代SQLAlchemy集合

什麼是一次只加載一個集合的一個元素的最佳方式,所以我可以一次複製單個對象(以及它們的所有子行)?

回答

1

嘗試使用Session.expunge處理每個節點(帶孩子)後清理會話。下面的示例代碼打印會話中的實例數量:

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('node.id')) 
    name = Column(String(50)) 
    children = relationship("Node", 
      backref=backref("parent", remote_side=[id],) 
      ) 

def process_node(node, expunge=False, ident=1): 
    print "Node: ", "-" * ident, node, " --> ", len(session.identity_map) 
    for child in node.children: 
     process_node(child, expunge, ident + 4) 
     session.expunge(child) 

roots = session.query(Node).filter(Node.parent == None) 
for root in roots: 
    process_node(root, True)