私は 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)
リストの代わりに定数メモリ イテレータを取得する方法はありますか?