Ich arbeite mit einer Oracle-Datenbank mit Millionen von Zeilen und über 100 Spalten. Ich versuche, diese Daten in einer HDF5-Datei unter Verwendung von Pytables mit bestimmten indizierten Spalten zu speichern. Ich werde Teilmengen dieser Daten in einem Pandas DataFrame lesen und Berechnungen durchführen.Lesen einer großen Tabelle mit Millionen von Zeilen von Oracle und Schreiben in HDF5
Ich habe versucht, die folgenden:
Laden Sie die in der Tabelle, ein Dienstprogramm in eine CSV-Datei, die CSV-Datei Chunk Chunk mit Pandas lesen und mit pandas.HDFStore
zu HDF5 Tabelle anhängen. Ich habe eine dtype-Definition erstellt und die maximalen Zeichenfolgengrößen angegeben.
Aber jetzt, wenn ich versuche, Daten direkt von Oracle DB herunterzuladen und es in HDF5-Datei über pandas.HDFStore
zu veröffentlichen, stoße ich auf einige Probleme.
pandas.io.sql.read_frame unterstützt kein Chunked-Lesen. Ich habe nicht genug RAM, um die gesamten Daten zuerst in den Speicher laden zu können.
Wenn ich versuche, cursor.fecthmany()
mit einer festen Anzahl von Datensätzen zu verwenden, dauert die Leseoperation an der DB-Tabelle Alter wird nicht indiziert und ich muss Datensätze in einem Datumsbereich lesen. Ich benutze DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
aber der erstellte DataFrame leitet immer den dtype statt erzwingen den Dtype, die ich zur Verfügung gestellt habe (im Gegensatz zu read_csv, die an den dtype ich bereitstelle). Wenn ich diesen Datenrahmen an eine bereits existierende HDFDatastore
angehängt habe, gibt es daher eine Typabweichung bei z. Ein float64 wird vielleicht als int64 in einem Chunk interpretiert.
Schätzen Sie, wenn Sie Ihre Gedanken anbieten könnten und zeigen Sie mir in die richtige Richtung.
Ihr aktueller Ansatz (mit einem csv) und dtype Korrektur ist richtig. SQL wird ein großes Update in 0.14 bekommen (0.13 wird in Kürze veröffentlicht). Leider ist dtype ineference/chunking nicht verfügbar. Willkommen PRS ist aber! Siehe dieses Problem: https://github.com/pydata/pandas/issues/4163 – Jeff
Ich schlage vor, das Oracle-Tag zu entfernen, es sei denn, Sie haben Probleme auf der Oracle-Seite der Dinge. –
Sie sollten Ihre dba bitten, die Tabelle in ein bereichspartitioniertes Objekt umzuwandeln, danach sollte es einfach per Partition erreichbar sein. – klashxx