为何Dataframe.to_sql()导入一定行数后速度大幅下降?
Pandas to_sql分批导入MSSQL后期速度骤降排查
我有一个包含约900万条记录、56列的大型Pandas DataFrame,尝试用DataFrame.to_sql()导入MSSQL表时,一次性导入整个DataFrame经常出现内存错误。
为解决这个问题,我将DataFrame按10万行分批循环导入,虽然避免了内存错误,但导入约580万条记录后,代码速度骤降。使用的代码如下:
maxrow = df.shape[0] stepsize = 100000 for i in range(0, maxrow, stepsize): batchstart = datetime.datetime.now() if i == 0: if_exists = 'replace' else: if_exists = 'append' df_import = df.iloc[i:i+stepsize] df_import.to_sql('tablename', engine, schema='tmp', if_exists=if_exists, index=False, dtype=dtypes )
我统计了各批次的导入时间,发现存在明显的速度拐点:前600万条导入耗时约40分钟,后续300万条却耗时2小时20分钟,且这个结果在5万、10万、20万行的分批规模下基本一致。
我曾猜测是MSSQL表规模过大或每次导入后缓存/存储内容导致,因此尝试过以下方法,但均无效果:
- 将数据导入两个不同的表
- 每次导入后对SQLAlchemy session执行
expunge_all() - 手动在导入500万条记录后停止,使用新的engine对象从500万条开始导入
更新
作为最后尝试,我反转了循环顺序,从最高索引开始分批上传DataFrame内容。结果批次导入时间基本反转,这表明并非连接过载或SQL表过大导致,而是DataFrame后半部分的数据本身存在差异(比如体积更大)。
感谢所有提供帮助的人,看来我需要检查数据本身以找出原因。
内容的提问来源于stack exchange,提问作者Beek
相关产品推荐
相关产品推荐

