【问题标题】:performance of insert with python and sqlite3使用 python 和 sqlite3 插入的性能
【发布时间】:2013-07-25 19:57:51
【问题描述】:

我正在对 SQLite3 数据库进行大批量插入操作,并试图了解我应该期待什么样的性能与我实际看到的性能。

我的桌子是这样的:

cursor.execute(
            "CREATE TABLE tweets(
             tweet_hash TEXT PRIMARY KEY ON CONFLICT REPLACE,
             tweet_id INTEGER,
             tweet_text TEXT)"
        )

我的插入看起来像这样:

cursor.executemany("INSERT INTO tweets VALUES (?, ?, ?)", to_write)

其中to_write 是一个元组列表。

目前,数据库中有大约 1200 万行,插入 50 000 行大约需要 16 分钟,在 2008 年的 macbook 上运行。

这听起来合理吗,还是发生了什么严重的事情?

【问题讨论】:

  • 您是否尝试过在每个查询中插入多个值?也许不是一次全部,因为您必须创建一个非常大的字符串,但每个字符串可能有 100 个?以我的经验,这大大提高了插入速度。
  • @GustavLarsson: executemany 应该利用已经在每行列中准备查询和流式传输。
  • @GustavLarsson:您是如何提议创建多个插入的? execute()executemany() 只允许 one 语句。
  • 我猜想for i in range(0,len(my_list),100):execute_many(qry,my_list[i:i+100])之类的东西
  • executemany 是否使用事务?如果没有,sqlite 将在内部使用隐式事务包装每个插入语句,这可能会导致批量插入的性能巨大。有关更多信息,请参阅这些:sqlite.org/faq.html#q19stackoverflow.com/questions/3852068/sqlite-insert-very-slow

标签: python sql sqlite


【解决方案1】:

据我了解,性能不佳的主要原因是您浪费时间提交许多 SQLite 事务。怎么办?

删除索引,然后

PRAGMA synchronous = OFF (or NORMAL)

插入 N 行块(定义 N,尝试 N=5000 开始)。 在插入块之前做

BEGIN TRANSACTION

插入后做

COMMIT

另见http://www.sqlite.org/faq.html#q19

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多