1

私は 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) メモリ使用量が狂ったように増え始めること、の 2 つに気付きました。したがって、私の結論は、このコードはリスト内のすべての結果セットをフェッチし、それを繰り返し処理していたということです。これは正しいです?

cx_Oracle、次のようなクエリを実行すると:

conn = cx_Oracle.connect(connectionString)
cursor = conn.cursor()
cursor.execute("select * from tbl_ourpois")
for poi in cursor:
    print poi

結果のカーソルは、結果をバッファーに取得し、リストにすべてをロードする代わりに、必要に応じて結果を返すイテレーターとして動作します。このループはほぼ瞬時に結果の出力を開始し、メモリ使用量はかなり低く一定です。

SQLAlchemy でこの種の動作を取得できますか? session.query(POI)リストの代わりに定数メモリ イテレータを取得する方法はありますか?

4

0 に答える 0