我正在尝试迭代一个非常大的表。
iter(self.session.query(Trade).order_by(Trade.time).yield_per(1))
或
for t in self.session.query(Trade).order_by(Trade.time).yield_per(1):
prev = t
阻止计算机崩溃,因为内存不足。 yield_per(1)似乎没有做任何事情。如何在不将所有内容全部加载到内存中的情况下迭代大型表?
答案 0 :(得分:1)
我正在回答我自己的问题。 SQLAlchemy wiki页面上的“WindowedRangeQuery”(由@Yaroslav Admin提供的链接)将是理想的,但显然MySql缺少“窗口函数”。维基页面上提到的“非窗口函数版本”方法可以更好地扩展,但对数据做了太多假设。
此解决方案有效,但由于添加了偏移量,每个页面的速度会变慢:
def get_all_trades(self):
pagesize = 1000000
row_count = self.session.query(Trade).count()
offset = 0
while offset < row_count:
query = self.session.query(Trade). \
order_by(Trade.time). \
slice(offset, offset+pagesize). \
limit(pagesize)
offset += pagesize
for d in query:
yield d
我对这个解决方案并不满意。也许我应该切换到Postgresql来获取那些窗口函数。