2013-12-15 3 views
6

Ich verwendete 32-Bit-Python auf einem 32-Bit-Betriebssystem und wann immer ich versehentlich Werte an ein Array in einer unendlichen Liste angehängt oder versucht, eine zu große Datei zu laden , Python würde nur mit einem Speicherfehler aufhören. Allerdings verwende ich jetzt 64-Bit-Python auf einem 64-Bit-Betriebssystem, und anstatt eine Ausnahme zu geben, verbraucht Python jedes letzte Bit Speicher und bewirkt, dass mein Computer einfriert, so dass ich gezwungen bin, es neu zu starten.64-Bit-Python füllt Speicher, bis Computer friert ohne memerror

Ich schaute mich um Stapelüberlauf und es scheint nicht, als ob es eine gute Möglichkeit ist, die Speichernutzung zu steuern oder die Speichernutzung zu begrenzen. Zum Beispiel begrenzt diese Lösung: How to set memory limit for thread or process in python? die Ressourcen, die Python verwenden kann, aber es wäre unpraktisch, in jedes Stück Code einzufügen, das ich schreiben möchte.

Wie kann ich dies verhindern?

+0

Welches Betriebssystem? Wie viel Auslagerungsspeicher hast du? – mgilson

+0

@mgilson Windows 8. Ich bin mir nicht sicher, was Auslagerungsraum ist, weil es scheint, dass etwas für Linux nach google gelten. – shimao

+1

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

Antwort

1

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.

Verwandte Themen