您收到的错误是由熊猫版本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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)