Python高效读取千万级大表:SSCursor流式游标实战指南

阿橙
阿橙
发布时间:2026-10-13| 4人浏览过
原创

本文介绍Python读取千万行大表时避免内存溢出的方案。通过MySQLdb.cursors.SSCursor流式游标,逐行返回数据而不缓存全量结果,结合fetchone迭代处理,显著降低内存占用。需注意SSCursor期间连接独占及60秒超时限制,建议快速处理数据或调整NET_WRITE_TIMEOUT参数。

在Python进行数据导出或迁移时,经常面临需要从包含海量数据的大表中获取巨大结果集的场景。

若采用传统的全量加载方式,Python程序会将所有数据行缓存至内存中,这极易导致内存耗尽甚至程序崩溃。

针对上述问题,可采取以下优化策略:

1)启用SSCursor(流式游标),从而避免客户端占用过多内存资源。该游标机制并不在内存中缓存任何数据,而是直接从存储块中读取记录,并逐条返回给用户。

2)采用迭代方式而非fetchall方法,这样既能节省内存空间,又能快速获取数据。

import MySQLdb.cursors

conn = MySQLdb.connect(host='ip地址', user='用户名', passwd='密码', db='数据库名', port=3306,
   charset='utf8', cursorclass = MySQLdb.cursors.SSCursor)
cur = conn.cursor()
cur.execute("SELECT * FROM bigtable");
row = cur.fetchone()
while row is not None:
 do something
 row = cur.fetchone()

cur.close()
conn.close()

在使用该方案时,需特别注意以下几点:

1、由于SSCursor属于无缓存游标,在结果集未完全读取完毕前,当前conn连接对象无法执行其他SQL操作,甚至无法创建新的cursor。

若需执行其他数据库操作,请另行创建独立的连接对象。

2、每次读取数据后必须迅速处理,单次处理耗时不得超过60秒,否则MySQL将主动断开连接。此外,可通过执行SET NET_WRITE_TIMEOUT = xx命令来延长超时时间间隔。

以上即为解决Python读取千万行大表内存问题的完整方案,希望能为读者提供有价值的参考。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。