【问题标题】:Best method for sending large pandas dataframe to SQL database?将大熊猫数据帧发送到 SQL 数据库的最佳方法?
【发布时间】:2019-11-20 09:44:47
【问题描述】:

我有一个 pandas 数据框,它有 10 列和 1000 万行。

我在 pgadmin4(一个管理数据库的应用程序,如 MSSQL 服务器)中创建了一个空表,用于存储这些数据。

但是,当运行以下命令时:

my_dataframe.to_sql('name_of_sql_table',connection, index = False, if_exists = 'append', method="multi") 

考虑到进程太长/内存不足,它需要很长时间才能运行并且经常使我的 jupyter 内核崩溃。

有没有什么可取的方法来加快“将pandas发送到sql表”?

我能想到的一些事情是将数据拆分为 100 万行块,然后一次发送一个 - 在运行 to_sql() 方法时附加行。

我没有直接将数据加载到 pgadmin4 的选项 - 我唯一的方法是将数据从 python 发送到 pgadmin。

【问题讨论】:

  • 我建议您先尝试拆分方法,这应该非常简单,如果本地计算机上的内存是问题,它应该会有所帮助。
  • 即使是 1M 行,对于一次运行的 sql server 命令来说也是很多的,尤其是对于需要稳定性的生产系统。最好的猜测是分裂。我曾经有一个循环运行并使用df.iloc[i:i+chuncksize].to_sql(....),我每次都会增加chuncksize
  • 我建议块大小可能是 10k-100k,如果你把它做得太小,你会增加很多事务开销,事情又会开始变慢。

标签: python pandas postgresql pgadmin


【解决方案1】:

看看https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

如果这适用于您的pandas 版本,请使用

df.to_sql("table_name", 
          connection, 
          index=False, 
          if_exists='append',
          chunksize=25000,
          method=None)

您的查询可能会崩溃,因为您使用的是method='multi',因为它会执行以下操作:

方法:{None, ‘multi’, callable},默认无

控制使用的 SQL 插入子句:

‘multi’:在单个 INSERT 子句中传递多个值。 可通过签名(pd_table、conn、keys、data_iter)调用。 详细信息和示例可调用实现可以在节插入方法中找到。

这意味着pandas 将在内存中为所有行构造语句。使用chunksize 和每行一个INSERT 语句将允许pandas 将保存分块到数据库。

【讨论】:

    【解决方案2】:

    我也遇到过这个问题,但我没有使用 method='multi' 并且在使用 chunksize=1000 时它崩溃并出现以下错误。

    ProgrammingError("(pyodbc.ProgrammingError) ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]传入的请求参数过多,服务器最多支持2100个参数。减少参数数量,重新发送请求。(8003) (SQLExecDirectW)')",),

    所以,我将列数除以 2100,并使用 150 作为块大小。如果有更好的方法,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多