2017-05-12 13 views
0

Also habe ich eine Tabelle mit 146 Spalten und ca. 8 Mil Reihen von spärlichen Daten lokal in einem Postgresql gespeichert.Psycopg - Speicherfehler bei der Auswahl eines großen Datensatzes aus PostgreSQL

Mein Ziel ist es, den gesamten Datensatz auf einmal, speichern Sie es in eine Pandas Datenrahmen und führen einige Berechnungen zu wählen.

Bisher habe ich über serverseitige Cursors in vielen Threads gelesen, aber ich denke, ich mache etwas falsch, da ich nicht Verbesserung der Speicher sehen. Die Dokumentation ist auch recht begrenzt ..

Mein Code so weit ist die folgende:

cur=conn.cursor('testCursor') 
cur.itersize = 100000 
cur.execute("select * from events") 

df = cur.fetchall() 

df = pd.DataFrame(df) 
conn.commit() 
conn.close() 

Ich habe auch versucht fetchmany() oder fetchone() anstelle von fetchall(), aber ich weiß nicht, wie um die Ergebnisse zu scrollen. Ich glaube, ich so etwas für fetchone nutzen kann(), aber ich weiß nicht, wie fetchmany zu handhaben():

df = cur.fetchone() 
while row: 
    row = cur.fetchone() 

schließlich bei fetchone() und fetchmany() wie kann ich verketten die Ergebnisse in einen einzigen Datenrahmen, ohne all meinen Speicher zu verbrauchen? Just zu beachten, dass ich 16gb verfügbar RAM

+0

Ein Ansatz auf Ihrem Problem könnte sein, Ihren ganzen Tag Tisch in einem säulen DB kopieren (zB. MonetDB) und die Analyse in Python ausführen. MonetDB erlaubt Ihnen, Python-Code in Abfragen einzubetten. Dies ist eine integrierte Funktion. Hier ein Beispiel ref: https://www.monetdb.org/blog/voter-classification-using-monetdbpython. Hoffe, das ist nützlich für Sie. –

+0

Sicher, danke! Wenn Sie keine Lösung mit Postgres finden, werde ich es versuchen – lacrima

Antwort

0

8 mil Zeilen x 146 Spalten (unter der Annahme, dass eine Spalte speichert zumindest ein Byte) würden Sie mindestens 1 GB habe. Wenn Sie bedenken, dass Ihre Spalten wahrscheinlich mehr als ein Byte pro Spalte speichern, würden Sie selbst dann, wenn Sie mit dem ersten Schritt Ihres Vorhabens Erfolg haben würden, RAM-Einschränkungen treffen (z. B. passt das Endergebnis nicht in den RAM).

Die übliche Strategie große Datensätze zu verarbeiten, wird sie in kleinen Chargen verarbeitet und dann die Ergebnisse (bei Bedarf) kombinieren. Schauen Sie sich zum Beispiel PySpark an. innerhalb der Abfrage einschließlich Code

+0

Ja, die Daten sind etwa 3,5 GB. Angenommen, ich möchte die Daten mit fetchmany() mehrmals in kleine Stapel verarbeiten. Wie kann ich die Ergebnisse scrollen? – lacrima

Verwandte Themen