【问题标题】:Speed up insertion of pandas dataframe using fast_executemany Python pyodbc使用 fast_executemany Python pyodbc 加快 pandas 数据帧的插入
【发布时间】:2018-01-22 13:11:42
【问题描述】:

我正在尝试将 .csv 文件中包含的数据从我的电脑插入到远程服务器。这些值被插入到一个包含 3 列的表中,即TimestampValueTimeseriesID。我必须一次插入大约 3000 行,因此我目前使用的是pyodbcexecutemany

到目前为止,我的代码如下所示:

with contextlib.closing(pyodbc.connect(connection_string, autocommit=True)) as conn:
    with contextlib.closing(conn.cursor()) as cursor:
        cursor.fast_executemany = True  # new in pyodbc 4.0.19

            # Innsert values in the DataTable table
            insert_df = df[["Time (UTC)", column]]
            insert_df["id"] = timeseriesID
            insert_df = insert_df[["id", "Time (UTC)", column]]
            sql = "INSERT INTO %s (%s, %s, %s)  VALUES (?, ?, ?)" % (
                sqltbl_datatable, 'TimeseriesId', 'DateTime', 'Value')

            params = [i.tolist() for i in insert_df.values]
            cursor.executemany(sql, params)

当我使用pyodbc 4.0.19 时,我将选项fast_executemany 设置为True,这应该可以加快速度。但是,由于某种原因,当我启用 fast_executemany 选项时,我没有看到任何重大改进。我可以使用其他方法来加快文件的插入速度吗?

此外,关于上面显示的代码的性能,我注意到当禁用autocommit=True 选项时,我在数据末尾包含cursor.commit() 命令时导入数据的速度明显更快。发生这种情况有什么我不知道的具体原因吗?

任何帮助将不胜感激:)

【问题讨论】:

标签: python sql-server python-3.x pypyodbc


【解决方案1】:

关于您注意到的cursor.commit() 加速:当您使用autocommit=True 时,您要求代码在每次插入时执行一个数据库事务。这意味着代码只有在数据库确认数据存储在磁盘上后才会恢复。当您在无数 INSERTs 之后使用 cursor.commit() 时,您实际上是在执行一个数据库事务,并且数据在此期间存储在 RAM 中(它可能会在您指示数据库完成时写入磁盘但并非全部写入磁盘交易)。

最终确定事务的过程通常需要更新磁盘上的表、更新索引、刷新日志、同步副本等,成本很高。这就是为什么您观察到您描述的两种情况之间的这种加速。 当采用更快的方式时,请注意,在您执行 cursor.commit() 之前,您无法 100% 确定数据在数据库中,因此可能需要在出现错误时重新发出查询(任何 部分 em> 事务将被回滚)。

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2019-12-16
    • 2023-04-04
    • 2020-08-21
    • 2023-03-30
    • 1970-01-01
    • 2018-08-02
    • 2021-04-01
    • 2015-11-06
    相关资源
    最近更新 更多