Memory ODBC Teradata驱动程序HY001内存分配错误。这是什么意思?

Memory ODBC Teradata驱动程序HY001内存分配错误。这是什么意思?,memory,memory-management,odbc,teradata,Memory,Memory Management,Odbc,Teradata,我使用的python脚本使用Teradata python模块将一批数据插入Teradata,脚本类似于下面的脚本。 它使用ODBC连接,有时会出现以下错误: [HY001][Teradata][ODBC Teradata驱动程序]内存分配错误。这个错误意味着什么?关于如何解决这个问题有什么建议吗 connection.executemany( 'INSERT INTO {}.{} ("{}") VALUES ({})' .format(database, table_name,

我使用的python脚本使用Teradata python模块将一批数据插入Teradata,脚本类似于下面的脚本。 它使用ODBC连接,有时会出现以下错误:
[HY001][Teradata][ODBC Teradata驱动程序]内存分配错误
。这个错误意味着什么?关于如何解决这个问题有什么建议吗

connection.executemany(
  'INSERT INTO {}.{} ("{}") VALUES ({})'
  .format(database, table_name,
          '","'.join(column_names),
          ','.join(['?']*len(columns_names))),
          records_for_insert,
          batch=True
)

Teradata团队能够帮助找出导致此错误的原因。 ODBC将请求大小限制为1MB(如果请求大小超过1MB,它将抛出一个错误,错误代码为
22001

据Teradata团队称:


“工程部门发现的ODBC错误处理最大1MB大小的请求消息。如果数据大小小于1MB,ODBC驱动程序将附加12个字节(KeepResp parcel)。如果额外字节导致超过1MB请求消息限制,则会返回内存分配错误。这种情况的解决方案是返回1MB错误,而不是由应用程序处理的内存分配错误。ODBC-17861跟踪该修复程序,并针对11月底到期的ODBC 15.10.01.07。”

我倾向于从两个方面避免Teradata 1MB的限制。(1) 通过将我的批划分为小于1MB的较小批,或(2)将方法更改为“rest”。例如,使用teradata模块:

import teradata
import pandas as pd
import numpy as np

udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False)

with udaExec.connect(method="odbc",system="DBName", username="UserName",
                      password="Password", driver="DriverName") as connect:

    #We can divide our huge_df to small chuncks. E.g. 100 churchs
    chunks_df = np.array_split(huge_df, 100)

    #Import chuncks to Teradata
    for i,_ in enumerate(chunks_df):

        data = [tuple(x) for x in chuncks_df[i].to_records(index=False)]
        connect.executemany("INSERT INTO DATABASE.TABLEWITH15COL") 
                values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",data,batch=True)
        print('Batch',i+1,'Completed')
如果您使用“rest”作为方法,则需要主机ip_地址,而不是驱动程序参数。e、 g

import teradata
import pandas as pd

# HOST_IP could be found with *nslookup viewpoint*
udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False) 
with udaExec.connect(method="rest",system="DBName", username="UserName",
                      password="Password", host="HOST_IP_ADDRESS") as connect:

    data = [tuple(x) for x in huge_df.to_records(index=False)]
    with connect.cursor() as e:
        e.executemany("INSERT INTO DATABASE.TABLEWITH15COL") 
                values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",data,batch=True)

我希望这将帮助您找到克服这一限制的方法。这里有一个链接,指向您是否选择使用它。

我也有同样的问题。这个问题在他们的论坛上仍然没有得到回答。IBM发布了一些产品的补丁,解决了这个问题