2

約 800K の画像を含む大きな lmdb があります。エントリを1つずつ読みたいだけです。私のコードは非常に単純で、次のようになります。

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

しかし、約 70000 のエントリを読み取った後、メモリ (~10GB) が不足します。理由がわかりません。以下のようにしようとしましたが、うまくいきませんでした。

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

なにか提案を?

4

1 に答える 1

0

エラー トレースが役立つ場合があります。map_sizeパラメータをチェックアウトします。ドキュメントから:

データベースの最大サイズは次のようになります。メモリ マッピングのサイズ設定に使用されます。データベースが map_size よりも大きくなると、例外が発生し、ユーザーは環境を閉じて再度開く必要があります。64 ビットでは、これを巨大 (たとえば 1 TB) にしてもペナルティはありません。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)
于 2016-05-18T22:40:43.320 に答える