2016-05-18 12 views
2

Ich habe eine große lmdb, etwa 800K Bilder. Ich möchte nur die Einträge nacheinander lesen. Mein Code ist sehr einfach und sieht wie folgt aus:Python LMDB große DBs (Speicher-Limit-Fehler)

with env.begin() as txn: 
cursor = txn.cursor() 
for key, value in cursor: 
    print(key) 

Aber nach etwa 70000 Einträge lesen aus dem Speicher läuft (~ 10 GB). Ich habe keine Ahnung warum. Ich habe versucht, wie unten zu tun, aber es hat nicht funktioniert.

for r in range(0,env.stat()['entries']): 
if r%10000==0: 
    if r!=0: 
     txn.commit() 
     cur.close() 
    txn=env.begin() 
    cur = txn.cursor() 
    print("Change Change Change "+ str(r)) 
    sys.stdout.flush() 
    if r==0: 
     cur.first() 
    else: 
     cur.set_range(key) 
     cur.next() 
key, value = cur.item() 

ein Vorschlag?

Antwort

0

Der Fehler Trace könnte helfen. Ich würde den map_size Param überprüfen. Von der docs:

Maximale Größe Datenbank kann zu wachsen; verwendet, um die Speicherzuordnung zu bemessen. Wenn die Datenbank größer als map_size wird, wird eine Ausnahme ausgelöst, und der Benutzer muss Environment schließen und erneut öffnen. Auf 64-Bit gibt es keine Strafe dafür, das zu machen (sagen wir 1 TB). Muss < 2 GB auf 32-Bit sein.

Dies wäre ein Beispiel, wenn das Schreiben:

with lmdb.open(LMDB_DIR, map_size=LMDB_MAX_SIZE) as env: 
    with env.begin(write=True) as txn: 
     return txn.put(mykey, value) 
+0

Dies ist das Fehlerprotokoll: slurmstepd: Job 1.008.515 überschritten Speichergrenze (65537464> 65536000), getötet zu werden slurmstepd: *** JOB 1008515 ON mmm269 CANCELED AT 2016-05-18T15: 09: 41 *** slurmstepd: Überschritt die Speichergrenze irgendwann. slurmstepd: Job-Limit überschritten dieser Thime ich 64 GB Ram zugeordnet, aber wieder ist es passiert. Die Gesamtgröße meiner DB ist 596 GB. – arash