You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:43:15