使用大数据集调用cursor.fetchall()时,python脚本挂起



我有一个返回125K行的查询。

目标是编写一个在行中迭代的脚本,并为每个行填充第二个表,其中包含根据查询结果处理的数据。

为了开发脚本,我创建了一个重复的数据库,其中包含一小部分数据(4126行)

在小型数据库上,以下代码有效:

import os
import sys
import random
import mysql.connector
cnx = mysql.connector.connect(user='dbuser', password='thePassword',
                          host='127.0.0.1',
                          database='db')
cnx_out = mysql.connector.connect(user='dbuser', password='thePassword',
                          host='127.0.0.1',
                          database='db')
ins_curs = cnx_out.cursor()
curs = cnx.cursor(dictionary=True)
#curs = cnx.cursor(dictionary=True,buffered=True) #fail
with open('sql\getRawData.sql') as fh:
    sql = fh.read()
curs.execute(sql, params=None, multi=False)
result = curs.fetchall()  #<=== script stops at this point
print len(result) #<=== this line never executes
print curs.column_names
curs.close()
cnx.close()
cnx_out.close()
sys.exit()

curs.execute(sql, params=None, multi=False)行在大数据库和小数据库上都成功。如果我在循环中使用curs.fetchone(),我可以读取所有记录。

如果我更改线路:

curs = cnx.cursor(dictionary=True)

阅读:

curs = cnx.cursor(dictionary=True,buffered=True)

脚本挂在curs.execute(sql, params=None, multi=False)

我找不到关于fetchall()的任何限制的文档,也找不到任何增加缓冲区大小的方法,也没有办法告诉我需要多大的缓冲区。

没有任何例外。

我该如何解决此问题?

我也遇到了同样的问题,首先是一个返回约70k行的查询,然后是一个只返回约2k行的查询(对我来说,RAM也不是限制因素)。我从使用mysql.connector(即mysql-connecter-python包)切换到MySQLdb(即mysql-python包),然后能够在大型查询中毫无问题地获取所有()。这两个包似乎都遵循pythonDBneneneba API,所以对我来说,MySQLdb是mysql.connector的一个替代品,除了建立连接的行之外,不需要任何代码更改。YMMV,如果您正在利用mysql.connecter.的特定功能

务实地说,如果你没有特定的理由使用mysql.connector,那么解决方案就是切换到一个效果更好的包!

最新更新