sql-server - pyodbc:使用带有 TEXT / NTEXT 列的 fast_executemany 的内存错误
问题描述
我在将行插入数据库时遇到问题。只是想知道是否有人知道为什么会这样?当我避免使用 fast_executemany 但插入变得非常慢时,它可以工作。
driver = 'ODBC Driver 17 for SQL Server'
conn = pyodbc.connect('DRIVER=' + driver + ';SERVER=' + server+ \
';UID=' + user+ ';PWD=' + password)
cursor = conn.cursor()
cursor.fast_executemany = True
insert_sql = """
INSERT INTO table (a, b, c)
VALUES (?, ?, ?)
"""
cursor.executemany(insert_sql, insert_params)
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-12-e7e82e4d8c2d> in <module>
2 start_time = time.time()
3
----> 4 cursor.executemany(insert_sql, insert_params)
MemoryError:
解决方案
使用或列fast_executemany
时存在一个已知问题,如 GitHub 上所述。TEXT
NTEXT
问题在于,当 pyodbc 查询数据库元数据以确定列的最大大小时,驱动程序返回 2 GB(而不是 0,就像为[n]varchar(max)
列返回的那样)。
pyodbc 为参数数组中的每个[N]TEXT
元素分配 2 GB 的内存,Python 应用程序很快就会耗尽内存。
解决方法是使用cursor.setinputsizes([(pyodbc.SQL_WVARCHAR, 0, 0)])
(如此处所述)诱使 pyodbc 将[N]TEXT
列视为[n]varchar(max)
列。
(鉴于这[N]TEXT
是 SQL Server 不推荐使用的列类型,因此不太可能对此问题进行正式修复。)
推荐阅读
- json - 以最佳方式存储数据库 json 文件以响应本机应用程序
- go - 从结构中删除元素,但仅针对这一功能
- spacy - Spacy:为什么使用管道时向量不可用?
- angular - 检查已加载的嵌套组件
- asp.net - 在 docker 中安装 .net framework 4.7.2
- laravel - Laravel - PHPUnit 多步测试
- jquery - 使用 django ajax jquery 提交一个文件不起作用的表单
- java - Selenium InternetExplorer 11 - 连续警报 - 第二个警报上的文本为空
- c++ - 是否可以计算任意 std::regex 对象中的捕获组数?
- python - 如何用最后一个条目替换空字典条目