伙计们!希望有人能帮我解决这个问题。在
我通过SQLAlchemy执行一个查询,返回~6kk行(这是历史数据),我需要在python脚本上处理这些行。我有一些函数来读取和处理使用pandas的数据数据帧。这里其功能是:
def consulta_db_cancelamentos(db_con, query):
engine = create_engine(db_con, pool_recycle=3600)
con = engine.connect()
query_result = con.execution_options(stream_results=True).execute(query)
query_result_list = []
while True:
rows = query_result.fetchmany(10000)
if not rows:
break
for row in rows:
data = row['data'],\
row['plano'],\
row['usuario_id'],\
row['timestamp_cancelamentos'],\
row['timestamp'],\
row['status']
query_result_list.append(data)
df = pd.DataFrame()
if df.empty:
df = pd.DataFrame(query_result_list)
else:
df.append(pd.DataFrame(query_result_list))
df_cor = corrige_cancelamentos_df(df, '2017-01-01', '2017-12-15')
con.close()
return df_cor
如您所见,我已经在尝试读取数据并将其处理/存储在10k行块中。当我试图执行整个脚本时,我在函数上遇到了这个错误(我还包括了在main()
上引发的错误):
我写consulta_db_cancelamentos
的方式已经是对SO和SQLAlchemy文档进行搜索的结果。假设我无法访问MySQL服务器管理。在
当我将查询限制为只为一个usuario_id
带来结果时,例如(大约50行),它工作得很好。我在MySQL Workbench上执行了相同的查询,持续时间/Fetch为251.998秒/357.541秒
我遇到了这样的问题。在将
stream_results=True
放入查询后,我遇到了问题。在对我来说,参数
net_write_timeout
引起了麻烦。当stream_results=True
并且应用程序没有立即读取从MySQL服务器发送的所有数据,那么在MySQL服务器端,与应用程序的写通信(发送数据包)将被阻止。net_write_timeout
似乎是一个参数,它控制MySQL服务器对被阻止的套接字操作的写入允许连接的秒数。在所以,我将
net_write_timeout
参数从60
(默认值)改为3600
,并解决了这个问题。在解决了在MySQL Server中执行此命令的问题:
这个解决方案是在这里提出的Lost connection to MySQL server during query
相关问题 更多 >
编程相关推荐