Memory ODBC Teradata驱动程序HY001内存分配错误。这是什么意思?
我使用的python脚本使用Teradata python模块将一批数据插入Teradata,脚本类似于下面的脚本。 它使用ODBC连接,有时会出现以下错误: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,
[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发布了一些产品的补丁,解决了这个问题