2016-12-19 4 views
0

Ich bin ein Neuling in Python. Ich habe einen Speicherfehler, wenn ich zwei dicts aus zwei Dateien lade. Diese beiden Dateien sindWie 2 große Diktat in Python laden?

with open(filename, 'rb') as f: 
    hashtable_album = {} 
    for line in f: 
    # print i 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    # print a 
    # print type(a) 
    hashtable_album[itembuf] = a 
f.close() 
with open(filename2, 'rb') as f2: 
    hashtable_item={} 
    i=0 
    for line in f: 
    print len(dic) 
    print i 
    #print line 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    #print a 
    # print type(a) 
    hashtable_item[itembuf] = a 
    i=i+1 
f2.close() 

die erste Datei über 400 MB und es ist größer als die zweite, die etwa 200 MB ist, und ich kann die erste Datei successfully.But laden, wenn ich die zweite Datei laden I Speicherfehler bekam als

Traceback (most recent call last): 
    File "E:/py_workspace/1.0_memory_error.py", line 44, in <module> 
    hashtable_item[itembuf] = a 
    MemoryError 

Wenn ich die Reihenfolge zu ändern, die Datei schreib file2 zunächst und file1 zu folgen, gibt es auch einen Speicherfehler, wenn ich laden Sie die zweite Datei zu laden. Ich denke, dass der Speicherfehler aus dem dict kommt so lösche ich die dict, nachdem ich file1 als

hashtable_album = {} 

laden und zum Laden von file2 gehen. Und dieses Mal funktioniert es ohne Speicherfehler. Aber ich muss diese 2 dicts gleichzeitig verwenden. Wie kann ich sie zusammen laden?

tipps: Ich habe versucht, die cPickle das Diktat zu speichern, aber es kann nicht funktionieren und ich bekomme entweder den Speicherfehler.

+0

** Daten Container und Komparator in der gleichen Skript **, ist sehr schlechte Idee! Daten, die für Sie wichtig sind und Sie irgendwo speichern, aber 'warum verwenden Sie kein Datenbanksystem?' Direkt 'IO' hat immer Fehler ausgelöst (hat Hardwareleistungsfehler). Haben Sie diesen Code unter "Virtuelles Betriebssystem" ausgeführt? – dsgdfg

Antwort

0

Sie führen wahrscheinlich 32-Bit-Python.

dass Überprüfen von

$ python -c "import sys; print sys.maxint" // 64-bit python 
9223372036854775807 

$ python-32 -c "import sys; print sys.maxint" // 32-bit 
2147483647 

Wenn Sie nicht weg tun können, in 32-Bit-Raum von läuft, dann haben Sie zwei Möglichkeiten

  1. Lernen C, und führen Sie die Verarbeitung mit C. Von der Eingabegröße der Datei Es kann sein, dass eine strikte Verwendung von Speicher (mallocs/callocs) es erlauben könnte, alles in mem zu halten.
  2. Wenn der von Ihnen verwendete Algorithmus map-reduce zulässt, ist es wahrscheinlich schneller Map-reduce zu lernen und partielle Dateiverarbeitung in jedem Schritt durchzuführen und dann das Ergebnis im letzten Schritt zu kombinieren.
  3. Nicht sicher, aber Sie könnten Cython ausprobieren.
+0

Vielen Dank für Ihren Rat, ich werde diese versuchen. – Wenson

+0

Ich entferne die 32-Bit-Python und ändern Sie die 64-Bit-Python, dann lade ich meine Python-Datei neu. Es funktioniert ohne Speicherfehler !!! Ich danke dir sehr ! @Ajeet – Wenson

+0

Gern geschehen. :) Vergessen Sie nicht, die Antwort @Wenson zu akzeptieren. Auf diese Weise werden andere wissen, dass es funktioniert hat. –