解决mysqldb查询大量数据导致内存使用过高的问题

1.源码

connection=MySQLdb.connect(
    host="thehost",user="theuser",
    passwd="thepassword",db="thedb")
cursor=connection.cursor()
cursor.execute(query)
for row in cursor.fetchall():
    print(row)

2.问题

普通的操作不管是fetchall()还是fetchone()都是先将数据加载到本地再进行计算,大量的数据会导致内存资源消耗光。解决的方法是使用SSCurosr光标来处理。

3.优化后的代码

import MySQLdb.cursors
connection=MySQLdb.connect(
    host="thehost",user="theuser",
    passwd="thepassword",db="thedb",
    cursorclass = MySQLdb.cursors.SSCursor)
cursor=connection.cursor()
cursor.execute(query)
for row in cursor:
    print(row)

參考文档:http://mysql-python.sourceforge.net/MySQLdb.html#

关键段落截取:

BaseCursor
The base class for Cursor objects. This does not raise Warnings.
CursorStoreResultMixIn
Causes the Cursor to use the mysql_store_result() function to get the query result. The entire result set is stored on the client side.
CursorUseResultMixIn
Causes the cursor to use the mysql_use_result() function to get the query result. The result set is stored on the server side and is transferred
row by row using fetch operations.
CursorTupleRowsMixIn
Causes the cursor to return rows as a tuple of the column values.

CursorDictRowsMixIn

Causes the cursor to return rows as a dictionary, where the keys are column names and the values are column values. Note that if the column names are not unique, i.e., you are selecting from two tables that share column
names, some of them will be rewritten as table.column. This can be avoided by using the SQL ASkeyword.
(This is yet-another reason not to use * in SQL queries, particularly where JOIN is
involved.)

Cursor
The default cursor class. This class is composed of CursorWarningMixInCursorStoreResultMixInCursorTupleRowsMixIn, and BaseCursor,
i.e. it raises Warning, usesmysql_store_result(), and returns rows as tuples.
DictCursor
Like Cursor except it returns rows as dictionaries.
SSCursor
A "server-side" cursor. Like Cursor but uses CursorUseResultMixIn.
Use only if you are dealing with potentially large result sets.
SSDictCursor
Like SSCursor except it returns rows as dictionaries.
时间: 2024-11-25 03:39:04

解决mysqldb查询大量数据导致内存使用过高的问题的相关文章

POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384列. excel2003是以二进制的方式存储,这种格式不易被其他软件读取使用:而excel2007采用了基于XML的ooxml开放文档标准,ooxml使用XML和ZIP技术结合进行文件存储,XML是一个基于文本的格式,而且ZIP容器支持内容的压缩,所以其一大优势是可以大大减小文件的尺寸. 2. 大批

php查询mysql返回大量数据结果集导致内存溢出的解决方法

web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答案是: mysql_query 和 mysql_unbuffered_query 两个函数 首先来分析一个典型的实例:在执行下面的代码的时候就会导致php请求mysql返回结果太多(10W以上)导致PHP内存不够用. while ($row = mysql_fetch_assoc($result))

记一次解决缓存不释放导致内存耗光问题

1 前言 通过脚本备份数据和系统,笔者遇到两项缓存过高不释放而导致内存使用过高问题,Zabbix截图如下, - 第一次是由每小时往挂载的Window共享里面存放备份文件引起 - 第二次是由每周备份系统过度地频繁读写文件系统引起缓存不释放引起 2 挂载Window共享备份引发的缓存问题 2.1 问题描述 挂载Window的共享成为Linux服务器的备份目录,发现备份后缓存过高,挂载范例如下, mount -t cifs -o username=user1%pwd1 //backupSer/back

es实战之查询大量数据

背景 项目中已提供海量日志数据的多维实时查询,客户提出新需求:将数据导出. 将数据导出分两步: 查询大量数据 将数据生成文件并下载 本文主要探讨第一步,在es中查询大量数据或者说查询大数据集. es支持的查询数量 es默认支持的查询数量或者说查询深度是10,000. 可以动态修改max_result_window这个参数的设置,默认为10,000. PUT xz-logs/_settings?preserve_existing=true { "index.max_result_window&qu

解决CodeIgniter大量查询sql时占用内存大问题

最近的项目上面做大数据插入时总提示内存超出限制 不管怎样unset结果内存仍然很大! 最终发现是CI的机制导致,只要关闭掉问题解决了 $this->db->save_queries = FALSE; 它会把所有执行的SQL保存一份在内存做调试:果断关了! 这东西是从v1.6开始就有 Added $this->DB->save_queries variable to DB driver, enabling queries to get saved or not. Previously

WPF循环加载图片导致内存溢出的解决办法

程序场景:一系列的图片,从第一张到最后一张依次加载图片,形成"动画". 生成BitmapImage的方法有多种: 1. var source=new BitmapImage(new Uri("图片路径",UriKind.xxx)); 一般的场景使用这种方法还是比较方便快捷,但是对于本场景,内存恐怕得爆. 2. var data =File.ReadAllBytes("图片路径"); var ms = new System.IO.MemoryStr

大开测试:性能—如何解决数据库查询结果过大导致录制失败(连载3)

7.3  如何解决数据库查询结果过大导致录制失败 1.问题提出 在进行一个进销存管理应用系统测试过程中,发现在进行查询后,由于查询结果数据记录条数过多,而引起后续脚本无法继续录制. 2.问题解答 我们在测试过程中发现,很多设置和数据库应用相关.这个问题的解决方法可以通过设置Vugen.ini的CmdSize项完成. Vugen.ini文件存放于Windows系统目录下,首先查找是否在该文件中存在"[SQLOracleInspector]"项,并且查看是否已经存在"CmdSiz

MySQL information_schema表查询导致内存暴涨

case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from partitions group by table_name having count(*)>1 ); mysql 5.5, 1w+的innodb表. 下面看下调查的结果: 1.  sql的执行情况以及内存分配:   step1: 构造information_schema.tables临时表 1.1 

WCF传输过大的数据导致失败的解决办法

WCF传输过大的数据导致失败的解决办法 WCF服务默认是不配置数据传输的限制大小的,那么默认的大小好像是65535B,这才65KB左右,如果希望传输更大一些的数据呢,就需要手动指定一下缓冲区的大小了. 主要是为binding设置几个最大值属性就可以了,包括服务端和客户端均进行设置,不过配置都是一样的. <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpB