2017-04-26 41 views
2

我正在使用python腳本,該腳本使用類似於下面的腳本的teradata python模塊將一批數據插入到Teradata中。 它使用ODBC連接,偶爾會出現以下錯誤: [HY001][Teradata][ODBC Teradata Driver] Memory allocation error。這個錯誤是什麼意思?有關如何解決這個問題的任何建議?ODBC Teradata驅動程序HY001內存分配錯誤。什麼意思?

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

我遇到同樣的問題。這個問題在他們的論壇上沒有得到答覆:https://community.teradata.com/t5/Connectivity/python-redhat-7-odbc-running-into-HY001-Memory-Allocation-Error/m-p/73000。 IBM發佈了一個「解決」它的產品的補丁,http://www-01.ibm.com/support/docview.wss?uid=swg1JR55512 – jamesmf

回答

0

Teradata團隊能夠幫助找出是什麼原因導致此錯誤。 ODBC將請求大小限制爲1MB(如果請求大小超過1MB,則會引發錯誤,錯誤代碼爲22001)。

據到Teradata隊:

「通過與具有最大1MB大小的請求消息工程交易中發現的ODBC錯誤如果數據大小低於1MB,ODBC驅動程序追加12個字節(KeepResp包裹)。如果附加字節導致超過1MB請求消息限制,則返回內存分配錯誤。此情況的解決方案是返回1MB錯誤,而不是由應用程序處理的內存分配錯誤。由ODBC-17861進行跟蹤,並針對11月底到期的ODBC 15.10.01.07。「

0

我傾向於通過將我的批次分成小於1 MB的較小批次來避免Teradata 1 MB限制。例如,使用Teradata的模塊:

import teradata 
import pandas as pd 
import numpy as np 

udaExec = teradata.UdaExec (appName="test", version="1.0", logConsole=False) 
connect = udaExec.connect(method="odbc",system="DBName", username="UserName", password="Password", driver="DriverName") 

#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') 

我希望這將幫助你想辦法克服limitation.Here是Teradata Module Documentation一個鏈接,是你用它來選擇。

相關問題