pyodbc: ошибка памяти при использовании fast_executemany со столбцами TEXT / NTEXT - PullRequest
1 голос
/ 02 мая 2019

У меня проблема со вставкой строк в базу данных. Просто интересно, есть ли у кого-нибудь идеи, почему это происходит? Это работает, когда я избегаю использовать 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:

1 Ответ

2 голосов
/ 06 мая 2019

Существует известная проблема с fast_executemany при работе со столбцами TEXT или NTEXT, как описано на GitHub здесь .

Проблема заключается в том, что когда pyodbc запрашиваетметаданные базы данных, чтобы определить максимальный размер столбца, драйвер возвращает 2 ГБ (вместо 0, как было бы возвращено для столбца [n]varchar(max)).

pyodbc выделяет 2 ГБ памяти для каждого [N]TEXT элемента в массиве параметров, и приложению Python быстро не хватает памяти.

Обходной путь должен использовать cursor.setinputsizes([(pyodbc.SQL_WVARCHAR, 0, 0)]) (как описано здесь ) чтобы уговорить pyodbc на обработку [N]TEXT столбцов, таких как [n]varchar(max) столбцов.

(Учитывая, что [N]TEXT является устаревшим типом столбцов для SQL Server, маловероятно, что будетофициальное решение этой проблемы.)

...