【问题标题】:Copying LMDB to another LMDB reduces file size将 LMDB 复制到另一个 LMDB 可减少文件大小
【发布时间】: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()。我认为使用它会导致光标位置更改为第一条记录。

标签: python caffe lmdb


【解决方案1】:

您可以使用mdb_stat 查看数据库中的条目数。这应该可以确认您的副本是否正常工作。

【讨论】:

  • 你能否提供一个更详细的例子来说明如何使用mdb_stat
  • mdb_stat -fear 将为您提供免费列表使用情况、环境信息、所有子数据库和当前读者的信息
  • mdb_stat 需要编译。 C 实现在 github 上可用
【解决方案2】:

lmdb Python 包装器的较新版本(至少从 1.3.0 开始)包括an environment copy method,它有一个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

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多