2016-05-18 14 views
2

私は大きなlmdbを持っています。約800Kのイメージです。 エントリを1つずつ読むだけです。 私のコードは非常に簡単で、次のようになります。python LMDBの大きなDB(メモリ制限エラー)

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

しかし、それはメモリ不足について70000エントリ(〜10ギガバイト)を読んだ後。 なぜ私は考えていない。 私は以下のようにしようとしましたが、うまくいきませんでした。

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() 

どのような提案ですか?

答えて

0

エラートレースが役立つ可能性があります。私はmap_size paramをチェックしたいと思います。 docsから:

最大サイズのデータ​​ベースは、メモリマッピングのサイズを決めるために使用されます。データベースがmap_sizeよりも大きくなると、例外が発生し、ユーザーは環境を閉じて再オープンする必要があります。 64ビット版では、これを巨額(例えば1TB)にするためのペナルティはありません。 32ビットで< 2GBである必要があります。

書くときにこれは、例えば次のようになります。

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

を。これは、エラーログです: slurmstepd:*** JOB:ジョブ1008515は slurmstepdを殺され、メモリの制限(> 65536000 65537464)を超え1008515 ON mmm269 CANCELED AT 2016-05-18T15:09:41 *** slurmstepd:ある時点でステップのメモリ制限を超過しました。 slurmstepd:ジョブメモリの制限を超えました このthime私は64GBのRAMを割り当てましたが、もう一度それが発生しました。 私のDBの合計サイズは596 GBです。 – arash