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上时...
听起来你的时间很短,可能缺少适当的索引。 我建议在
1 | create index idx_table_a_b_c_d on table(a, b, c, d); |
这需要在数据库中只执行一次(并且可以通过Python完成)。
如果这是不可能的,那么我们可能会猜测