Ich hatte ein ähnliches Problem während der Arbeit mit einer Oracle db (für mich stellte es sich heraus, dass es lange dauerte, alle Daten abzurufen, während dieser Zeit hatte ich keine Ahnung, wie weit es war oder ob es ein Problem gab geht weiter) - meine Lösung bestand darin, die Ergebnisse meiner Abfrage in eine Reihe von CSV-Dateien zu streamen und sie dann in Pandas hochzuladen.
Ich bin mir sicher, es gibt schnellere Möglichkeiten, dies zu tun, aber das funktionierte überraschend gut für Datensätze von etwa 8 Millionen Zeilen.
können Sie den Code sehen ich für easy_query.py an meiner Github Seite verwendet, aber die Kernfunktion ich sah wie folgt aus verwendet:
def SQLCurtoCSV (sqlstring, connstring, filename, chunksize):
connection = ora.connect(connstring)
cursor = connection.cursor()
params = []
cursor.execute(sqlstring, params)
cursor.arraysize = 256
r=[]
c=0
i=0
for row in cursor:
c=c+1
r.append(row)
if c >= chunksize:
c = 0
i=i+1
df = pd.DataFrame.from_records(r)
df.columns = [rec[0] for rec in cursor.description]
df.to_csv(filename.replace('%%',str(i)), sep='|')
df = None
r = []
if i==0:
df = pd.DataFrame.from_records(r)
df.columns = [rec[0] for rec in cursor.description]
df.to_csv(filename.replace('%%',str(i)), sep='|')
df = None
r = []
Der umgebenden Modul importiert cx_Oracle, verschiedene Datenbankhaken/api-Anrufe zur Verfügung zu stellen, aber ich würde erwarten, dass es ähnliche Funktionen gibt, die mit einer ähnlich bereitgestellten MySQL API verfügbar sind.
Was ist nett ist, dass Sie die Dateien in Ihrem gewählten Verzeichnis aufbauen sehen können, so erhalten Sie eine Art von Feedback, ob Ihr Extrakt funktioniert und wie viele Ergebnisse pro Sekunde/Minute/Stunde Sie erwarten können .
Es bedeutet auch, dass Sie die ersten Dateien bearbeiten können, während der Rest abgerufen wird.
Sobald alle Daten in einzelnen Dateien gespeichert sind, können sie mit mehreren Anweisungen pandas.read_csv und pandas.concat in einen einzelnen Pandas-Datenrahmen geladen werden.
Nicht 5 Millionen Datensätze abrufen, vor allem für einen großen Tisch, die I/O wird dich töten. – dbugger
@dbugger: Ja, tut mir leid, die Abfrage da oben ist nur ein Beispiel, ich don 'SELECT * FROM table', aber immer noch, wenn ich Chunk, wird die Erstellung des Iterators für eine relativ kleine Teilmenge von Datensätzen (> 10%) nie Ende ... Also ich denke, ich mache etwas falsch mit dem Workflow. Vielen Dank. –
Nur um sicher zu sein, dass nichts anderes falsch ist (abgesehen von der Größe), wenn Sie der Abfrage ein 'LIMIT 100' (oder größer) hinzufügen, funktioniert es wie erwartet? – joris