在已经存在的lmdb中打乱数据(试图解决这个问题)。我检索了数据,洗牌并写回了新的lmdb。但是当我检查 lmdb 文件大小时,它减少了。旧的 lmdb 文件大小 : 3792896但新的 lmdb 文件大小 : 2314240.
蟒蛇代码完善:
import lmdb
from random import shuffle
lst_data = [];
env = lmdb.open('val_3', readonly=True);
with env.begin() as txn:
cursor = txn.cursor();
for key, value in cursor:
innerlst_data = [key,value];
lst_data.append(innerlst_data);
shuffle(lst_data);
env1 = lmdb.open('mod_val_3');
with env1.begin(write=True) as txn1:
for i in range(len(lst_data)):
str_id = '{:08}'.format(i);
txn1.put(str_id.encode('ascii'),lst_data[i][1]);
代码的参考取自此处。任何建议/想法都会有所帮助。
您可以使用mdb_stat
来查看数据库中的条目数。这应该可以确认您的副本是否正常工作。
较新版本的 lmdb Python 包装器(至少从 1.3.0 开始)包含一个环境copy
方法,该方法有一个compact
选项,似乎可以执行@Ravi尝试执行的操作。 像这样使用它(根据需要调整lmdb.open
参数):
# Copy old database into new one with compacting
# Old database is ~34G from deleting 200k of 400k original records
with lmdb.open(
"200k-split.lmdb",
map_size=109951162777,
subdir=False,
meminit=False,
map_async=True,
) as env:
env.copy(path="200k-split-compacted.lmdb", compact=True)
然后,您可以验证压缩文件是否与原始文件具有相同的记录数...
with lmdb.open(
"200k-split.lmdb",
map_size=109951162777,
subdir=False,
meminit=False,
map_async=True,
) as env:
print(env.stat())
# {'psize': 4096, 'depth': 3, 'branch_pages': 19,
# 'leaf_pages': 2228, 'overflow_pages': 3600000, 'entries': 200000}
with lmdb.open(
"200k-split-compacted.lmdb",
map_size=109951162777,
subdir=False,
meminit=False,
map_async=True,
) as env:
print(env.stat())
# {'psize': 4096, 'depth': 3, 'branch_pages': 19,
# 'leaf_pages': 2228, 'overflow_pages': 3600000, 'entries': 200000}
。但文件大小要小得多。
> ls -lah *.lmdb
-rw-rw-r-- 1 samueldy samueldy 14G Mar 2 03:31 200k-split-compacted.lmdb
-rw-r--r-- 1 samueldy samueldy 34G Mar 2 03:29 200k-split.lmdb