如何在不加载内存的情况下迭代大型表?

时间:2015-10-25 20:37:58

标签: python sqlalchemy

我正在尝试迭代一个非常大的表。

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)似乎没有做任何事情。如何在不将所有内容全部加载到内存中的情况下迭代大型表?

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来获取那些窗口函数。