pyodbcsqlAchemy启用快速执行许多

pyodbcsqlAchemy启用快速执行许多,第1张

pyodbc / sqlAchemy启用快速执行许多

您收到的错误是由熊猫版本0.23.0中引入的更改,在0.23.1恢复引起的,并在0.24.0重新作为解释在这里。产生的VALUES子句包含100,000个参数标记,并且似乎该计数存储在一个有符号的16位整数中,因此它会溢出并且您很有趣

SQL包含-31072参数标记,但是提供了100000个参数

您可以自己检查:

In [16]: 100000 % (2 ** 16) - 2 ** 16Out[16]: -31072

如果您想继续使用Pandas,则必须计算并提供合适的

chunksize
值,例如您使用的100,同时兼顾VALUES子句的最大行数限制为1000和2,100用于存储过程。再次在链接的Q
/ A中
详细说明。

更改之前,熊猫

executemany()
在插入数据时一直使用。较新的版本将检测使用中的方言是否支持INSERT中的VALUES子句。这种检测发生在
SQLTable.insert_statement()
并且无法控制,这很遗憾,因为启用了正确的标志后,PyODBC修复了它们的
executemany()
性能。

为了迫使熊猫

executemany()
再次与PyODBC一起使用,
SQLTable
必须进行monkeypatched:

import pandas.io.sqldef insert_statement(self, data, conn):    return self.table.insert(), datapandas.io.sql.SQLTable.insert_statement = insert_statement

如果未设置该标志,这将 非常
慢,

Cursor.fast_executemany
因此请记住设置适当的事件处理程序。

这是使用以下数据框的简单性能比较:

In [12]: df = pd.Dataframe({f'X{i}': range(1000000) for i in range(9)})

香草熊猫0.24.0:

In [14]: %time df.to_sql('foo', engine, chunksize=209)CPU times: user 2min 9s, sys: 2.16 s, total: 2min 11sWall time: 2min 26s

启用了快速执行功能的猴子修补熊猫:

In [10]: %time df.to_sql('foo', engine, chunksize=500000)CPU times: user 12.2 s, sys: 981 ms, total: 13.2 sWall time: 38 s


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5668716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存