2017-04-26 4 views
2

Ich verwende das Python-Skript, das einen Stapel Daten in Teradata einfügt, indem das Teradata-Python-Modul mit einem Skript ähnlich dem folgenden verwendet wird. Es verwendet eine ODBC-Verbindung und gelegentlich erhalte ich den folgenden Fehler: [HY001][Teradata][ODBC Teradata Driver] Memory allocation error. Was bedeutet dieser Fehler? Und irgendwelche Vorschläge, wie Sie das beheben können?ODBC-Teradata-Treiber HY001 Speicherzuweisungsfehler. Was ist die Bedeutung?

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

Ich habe das gleiche Problem. Die Frage bleibt in ihren Foren unbeantwortet: https://community.teradata.com/t5/Connectivity/python-redhat-7-odbc-running-into-HY001-Memory-Allocation-Error/m-p/73000. IBM hat einen Patch für ein Produkt veröffentlicht, der es unter http://www-01.ibm.com/support/docview.wss?uid=swg1JR55512 "adressiert" – jamesmf

Antwort

0

Das Teradata-Team war in der Lage zu helfen herauszufinden, was diesen Fehler verursacht. ODBC begrenzt die Anforderungsgröße auf 1 MB (wenn die Anforderungsgröße 1 MB überschreitet, wird ein Fehler mit dem Fehlercode 22001 ausgegeben).

Nach dem Teradata-Team.

„Der ODBC-Fehler von Engineering befasst sich mit der Anforderungs-Nachricht gefunden, die eine maximale 1MB Größe hat, wenn die Datengröße unter 1 MB, der ODBC-Treiber fügt 12 Byte (KeepResp Paket) Der Speicherzuordnungsfehler wird zurückgegeben, wenn die zusätzlichen Bytes das Überschreiten des 1MB-Anforderungsnachrichtenlimits verursachen Die Lösung für diesen Fall besteht darin, den 1 MB-Fehler anstelle des Speicherzuordnungsfehlers zurückzugeben, der von der Anwendung behandelt wird wird von ODBC-17861 verfolgt und für ODBC 15.10.01.07 Ende November geplant. "

0

Ich neige dazu, Teradata 1 MB Grenzen zu vermeiden, indem ich meine Charge in kleinere Chargen, die weniger als 1 MB sind, unterteilt. Ein Beispiel mit Teradata-Modul:

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

Ich hoffe, das Sie Wege zu finden, helfen zu überwinden, dass limitation.Here ist ein Link zu Teradata Module Documentation, waren Sie mit ihr zu wählen.

Verwandte Themen