我正在使用Pandas的to_sql
函数写入MySQL,但由于数据帧过大(1百万行,20列),导致出现了超时问题。
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
是否有更官方的方式来分块处理数据,并以块的形式写入行? 我已经编写了自己的代码,看起来可以工作。 不过我更倾向于一个官方的解决方案。 谢谢!
def write_to_db(engine, frame, table_name, chunk_size):
start_index = 0
end_index = chunk_size if chunk_size < len(frame) else len(frame)
frame = frame.where(pd.notnull(frame), None)
if_exists_param = 'replace'
while start_index != end_index:
print "Writing rows %s through %s" % (start_index, end_index)
frame.iloc[start_index:end_index, :].to_sql(con=engine, name=table_name, if_exists=if_exists_param)
if_exists_param = 'append'
start_index = min(start_index + chunk_size, len(frame))
end_index = min(end_index + chunk_size, len(frame))
engine = sqlalchemy.create_engine('mysql://...') #database details omited
write_to_db(engine, frame, 'retail_pendingcustomers', 20000)
read_sql
的 chunksize 问题有一个 issue(https://github.com/pydata/pandas/issues/2908),您可以随时为此打开一个新的 issue)。 - joris