Performance SqlAlchemy—当我对查询进行迭代时,我得到的是列表还是迭代器?

Performance SqlAlchemy—当我对查询进行迭代时,我得到的是列表还是迭代器?,performance,memory,sqlalchemy,Performance,Memory,Sqlalchemy,我开始学习如何使用SQLAlchemy,我遇到了一些效率问题 我在Oracle数据库上创建了一个映射现有大表的对象: engine = create_engine(connectionString, echo=False) class POI(object): def __repr__(self): return "{poi_id} - {title}, {city} - {uf}".format(**self.__dict__) def loadSession():

我开始学习如何使用SQLAlchemy,我遇到了一些效率问题

我在Oracle数据库上创建了一个映射现有大表的对象:

engine = create_engine(connectionString, echo=False)

class POI(object):
    def __repr__(self):
        return "{poi_id} - {title}, {city} - {uf}".format(**self.__dict__)

def loadSession():
    metadata = MetaData(engine)
    _poi = Table('tbl_ourpois', metadata, autoload = True)
    mapper(POI, _poi)
    Session = sessionmaker(bind = engine)
    session = Session()
    return session
此表有数百万个注册表。当我执行简单查询并尝试对其进行迭代时:

 session = loadSession()
 for poi in session.query(POI):
     print poi
我注意到两件事:1开始在屏幕上打印对象需要几分钟,2内存使用开始疯狂增长。因此,我的结论是,这段代码获取列表中的所有结果集,然后对其进行迭代。这是正确的吗

使用cx_Oracle,当我执行以下查询时:

conn = cx_Oracle.connect(connectionString)
cursor = conn.cursor()
cursor.execute("select * from tbl_ourpois")
for poi in cursor:
    print poi
结果游标的行为类似于迭代器,它将结果获取到缓冲区中,并在需要时返回结果,而不是将整个内容加载到列表中。这个循环几乎立即开始打印结果,并且内存使用率非常低且恒定


我能用炼金术得到这种行为吗?有没有办法从session.queryPOI中获得一个常量内存迭代器而不是一个列表?

好的,这似乎是重复的,但如果你们有什么要添加到这里给出的答案中,请添加。如果今天下午没有添加新信息,我会将其标记为副本。