【问题标题】:PostgreSQL Sqlalchemy commit takes a lot of timePostgreSQL Sqlalchemy 提交需要很多时间
【发布时间】:2019-01-20 03:08:11
【问题描述】:

当我尝试将更改提交到表中时,它需要很长时间(每 1000 行大约需要 300 秒)。

模型类:

class Quotes(base):
    __tablename__ = 'quotes'

    id = Column(INTEGER, primary_key=True, autoincrement=True, index=True)
    ticker = Column(TEXT)
    data = Column(ARRAY(FLOAT))


    def create():
        Session = sessionmaker(db)
        session = Session()
        return session


    def add(session, ticker=None, data=None):
        new_row = Quotes(ticker=ticker, data=data)
        session.add(new_row)

    def commit(session):
        t0 = time.time()
        session.commit()
        print("SQLAlchemy ORM commit(): Total time " + str(time.time() - t0) + " secs")

代码如下:

        for index in range(len(quotes['timestamp'])):
        temp = [
            int(quotes['timestamp'][index]), quotes['open'][index],
            quotes['high'][index], quotes['low'][index],
            quotes['close'][index]
        ]
        Quotes.add(session, ticker, temp)
        counter += 1

        if counter % 1000 == 0:
            Quotes.commit(session)

我有大约 100k 行。 一开始我创建了一个会话,然后在 for 循环的每次迭代中将新行添加到会话中。 我每 1000 行调用 .commit() 方法,大约需要 300 秒。 对我来说似乎太慢了。可以还是有另一种(正确的)方法将如此大的数据集插入数据库。

【问题讨论】:

  • 与其在 1000 行处提交,为什么不刷新 1000 行处的行并最终提交?
  • 这需要一些手动数据处理,但您可能对 COPY 感兴趣。您的表索引/触发器也很重吗? 300 行 1000 行听起来很多。
  • @mad_flush() 耗时 287 秒。
  • @IljaEverilä 抱歉,我是这个领域的新手。在哪里可以找到如何使用 Copy 的最佳实践或示例?至于表,我有主键(id)的索引
  • 一个更正可能是。您可能需要为您的主键删除额外的 index=True 。它将有自己的索引,您不需要在主键上有另一个索引。此外,您可以删除主键的自动增量。默认情况下,它将为单个主键提供。仍然想知道为什么仅 1000 行就需要 300 秒

标签: python postgresql sqlalchemy


【解决方案1】:

为了提高性能,您可以使用 bulk_save_method,它看起来是最快的。

您可以检查性能http://docs.sqlalchemy.org/en/latest/faq/performance.html#i-m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow

【讨论】:

  • 刚刚尝试使用 bulk_save_objects() 获得了 284.24 秒
  • 你能提供你使用 bulk_save_method 的代码吗?
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2022-08-25
相关资源
最近更新 更多