【发布时间】:2022-03-06 11:21:41
【问题描述】:
洗牌现有 lmdb (Trying to solve this problem) 中的数据。我检索了数据,改组并写回新的 lmdb。但是当我检查 lmdb 文件大小时,它会减小。旧 lmdb 文件大小:3792896,但新 lmdb 文件大小:2314240。
Python代码实现:
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]);
代码参考来自here。 任何建议/想法都会有所帮助。
【问题讨论】:
-
这很常见。由于删除的项目,旧数据库可能浪费了空间。这就是为什么数据库具有 SQLite 的 VACUUM 之类的功能。对于某些数据库,旧数据库中也可能存在新数据库中不存在的索引,这会占用磁盘空间,但 lmdb 似乎不允许您指定要索引的内容。
-
我尝试循环重复上述过程,lmdb 文件大小变为“0”。所以我认为不是浪费空间被删除,而是数据被删除,我不明白。
-
嗯。是的,这很奇怪。
-
你有没有试过在迭代之前调用 cursor.first() ?
-
不,我没有使用 cursor.first()。我认为使用它会导致光标位置更改为第一条记录。