【发布时间】:2014-07-23 08:26:34
【问题描述】:
我正在使用 Pandas 的 to_sql 函数写入 MySQL,由于帧大小过大(1M 行,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)
【问题讨论】:
-
fwiw,我不得不做这件事。
-
目前没有官方解决方案,但我们肯定会接受补丁来实现这一点(
read_sql(github.com/pydata/pandas/issues/2908) 的块大小存在问题,您可以随时打开一个这个)。 -
我创建了一个问题。 @joris-如果您不介意,请在此处添加评论并支持我:)。 github.com/pydata/pandas/issues/7347
-
为什么不直接将数据导出为csv文件(必须是表格格式),然后使用load data infile命令?
标签: python mysql sql pandas sqlalchemy