Ich weiß nicht, ob dies die Lösung für irgendjemand anderen als mich ist, da mein Fall sehr spezifisch war, aber ich dachte, ich würde es hier posten, für den Fall, dass jemand mein Verfahren verwenden könnte.
Ich hatte einen sehr großen Datensatz mit Millionen von Datenzeilen. Sobald ich diese Daten über eine PostgreSQL-Datenbank abgefragt habe, habe ich viel freien Speicherplatz (63,9 GB insgesamt auf einem Windows 10 64 Bit PC mit Python 3.x 64 Bit) und für jede meiner Abfragen verwendet 28-40 GB Speicher, da die Datenzeilen im Speicher gehalten werden sollten, während Python Berechnungen an den Daten durchführte. Ich benutzte das psycopg2-Modul, um eine Verbindung zu meinem postgreSQL herzustellen.
Meine erste Prozedur war, Berechnungen durchzuführen und dann das Ergebnis an eine Liste anzuhängen, die ich in meinen Methoden zurückgeben würde. Ich hatte ziemlich schnell am Ende zu viel im Speicher gespeichert und mein PC fing an, ausflippen (erstarrte, meldete mich aus Windows, Display-Treiber reagiert nicht mehr und etc).
Deshalb änderte ich meinen Ansatz mit Python Generators. Und da ich die Daten, die ich für Berechnungen verwendet habe, in meiner Datenbank speichern möchte, würde ich jede Zeile in meine Datenbank schreiben, so wie ich Berechnungen daran durchgeführt habe.
def fetch_rows(cursor, arraysize=1000):
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result
Und mit diesem Ansatz, den ich Berechnungen auf meinem ergab Ergebnis durch die Verwendung meines Generators tun würde:
def main():
connection_string = "...."
connection = psycopg2.connect(connection_string)
cursor = connection.cursor()
# Using generator
for row in fecth_rows(cursor):
# placeholder functions
result = do_calculations(row)
write_to_db(result)
Dieses Verfahren jedoch in der Tat erfordert, dass Sie genug physischen RAM die Daten im Speicher speichern müssen.
Ich hoffe, das hilft denen, die mit den gleichen Problemen da draußen ist.
Welches Betriebssystem? Wie viel Auslagerungsspeicher hast du? – mgilson
@mgilson Windows 8. Ich bin mir nicht sicher, was Auslagerungsraum ist, weil es scheint, dass etwas für Linux nach google gelten. – shimao
Sie könnten die Zeilengruppe hinzufügen, um das Speicherlimit in Ihrer 'PYTHONSTARTUP'-Datei festzulegen - das würde Ihnen helfen, wenn Sie Dinge ausführen. http://StackOverflow.com/a/5837597/148870 – Amber