关于python:从MySQL中获取大型数据集到Pandas Dataframe保持失败,即使使用Chunksize

Getting Large Dataset Out of MySQL into Pandas Dataframe keeps Failing , Even With Chunksize

我试图从mysql中将~70万行拉入Pandas数据帧。

我一遍又一遍地得到同样的错误:

Traceback(最近一次调用最后一次):

File"C:\Anaconda3\lib\site-packages\mysql\connector
etwork.py",

line 245, in recv_plain read = self.sock.recv_into(packet_view, rest)
ConnectionResetError: [WinError 10054]

远程主机强制关闭现有连接

在StackOverflow上搜索,我在另一个帖子中找到了来自ThePhysicist的一个很好的建议,所以我修改了我的代码如下。如果块大小超过200,它将不会运行,即使它是200,该过程最终会抛出"强制关闭"错误。

如果有人知道如何解决这个问题,我将非常感激。这非常令人沮丧,因为我在使用R时从未遇到过类似的问题

谢谢

我当前的代码(格式化道歉 - 无法弄清楚如何在这里做):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pandas import DataFrame
import time
import mysql.connector
import pandas as pd
import pandas.io.sql as psql

chunk_size = 300
offset = 0

cnx = mysql.connector.connect(user='xxx', password='xxx', database='xxx', host='xxx')
dfs = []

while True:
  print(offset)
  sql ="select a,b,c,d,e,f,g,h from table where a='xyz' order by b,c,d limit %d offset %d" % (chunk_size,offset)
  dfs.append(psql.read_sql(sql, cnx))
  offset += chunk_size
  if len(dfs[-1]) < chunk_size:
    print("break")
    break

full_df = pd.concat(dfs)

解释延长的回报:

1
2
select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
SIMPLE  table   ref idx_clientid,idx_char   idx_char    48  const   1173586 100 Using index condition

当我将代码移动到数据库所在的AWS服务器时,它运行正常,没有任何问题。问题似乎是当我运行代码并且机器没有驻留在AWS上时...


听起来你的时间很短,可能缺少适当的索引。 我建议在(a, b, c, d)上创建一个索引:

1
create index idx_table_a_b_c_d on table(a, b, c, d);

这需要在数据库中只执行一次(并且可以通过Python完成)。

如果这是不可能的,那么我们可能会猜测order by是耗时的部分。 要处理它,删除order by,在Python中加载数据,然后在Python中对其进行排序。 这不是我通常的建议 - 数据库更适合数据操作,但在某些情况下可能是必要的。