【问题标题】:Insert 2 Million rows into timscaldb with python-dataframes使用 python-dataframes 将 200 万行插入到 timscaldb
【发布时间】:2020-06-30 15:15:21
【问题描述】:

我想将大约 200 万行从 csv 插入 postgersql。 有2种方式。

  • 在 python 中使用数据框
  • 或直接在 PostgreSQL 中使用 Import csv

python方式:

engine = create_engine("postgresql+psycopg2://postgres:passwd@127.0.0.1/postgres")
con = engine.connect()
df = pd.read_csv(r"C:\2million.csv",delimiter=',',names=['x','y'],skiprows=1)
df.to_sql(name='tablename',con=con,schema='timeseries',if_exists='append',index=False)
print("stored")

插入需要 800 秒。 在 PostgreSQL 中直接导入的方式只需要 10 秒。

我认为,对于插入 200 万行,timescaledb 的插入时间比 800 秒快得多。

或者我试图插入行的方式只是限制因素?

【问题讨论】:

  • 方法不止两种。您可以在不使用数据框的情况下使用 python。例如,请参阅 copy_expert。

标签: python pandas postgresql csv insert


【解决方案1】:

我不是 timescaledb 方面的专家,但我认为它不会仅仅通过安装来做任何事情。您必须在要使用它的每个表上调用它,而您没有这样做。所以你在这里只使用普通的 PostgreSQL。

Pandas 的 to_sql 速度非常慢。默认情况下,它会在每个 INSERT 语句中插入一行,这对性能非常不利。如果您使用的是更新版本的 pandas (>=0.24.0),您可以指定 to_sql(...,method='multi',chunksize=10000) 通过为每个 INSERT 语句指定多行来减少吸吮。我认为 pandas 是通过这种方式实现的,而不是使用批量导入,因为每个数据库系统的批量导入方式都不同。

您从根本上滥用了熊猫。它是数据分析库,而不是数据库批量加载器库。您不仅没有利用特定于数据库的批量导入功能,而且还在将整个 csv 文件解析为内存数据帧,然后再开始将其写入数据库。

【讨论】:

    【解决方案2】:

    这是一种比 pandas 的 to_sql 快得多的方法

    (python) df.to_csv('tmp.csv')
    (sql) COPY foobar FROM 'tmp.csv' DELIMITER ',' CSV HEADER;
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多