将大熊猫数据框发送到SQL数据库的最佳方法?

时间:2019-11-20 09:44:47

标签: python pandas postgresql pgadmin

我有一个熊猫数据框,其中有10列和1000万行。

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

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

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

要花很长时间才能运行,并且由于该过程太长/内存不足,因此我的jupyter内核经常崩溃。

是否有建议的方法来加快“将熊猫发送到sql表”的速度?

我可以想到的一些事情是将数据分割成100万行块,然后一次发送一次-在运行to_sql()方法时追加行。

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

2 个答案:

答案 0 :(得分:0)

看看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'而崩溃,因为这样做是这样的:

  

方法:{无,“多个”,可通话},默认为无

     

控制使用的SQL插入子句:

     

“ multi”:在单个INSERT子句中传递多个值。   可通过签名(pd_table,conn,键,data_iter)调用。   详细信息和示例可调用实现可以在部分insert方法中找到。

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

答案 1 :(得分:0)

我也遇到了这个问题,但是我不使用method ='multi',当使用chunksize = 1000时,它崩溃并出现以下错误。

ProgrammingError(“(pyodbc.ProgrammingError)('42000','[42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]传入的请求包含太多参数。服务器最多支持2100个参数。减少参数数量并重新发送请求。(8003)(SQLExecDirectW)')“,),

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