Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将LMDB复制到另一个LMDB可减少文件大小_Python_Caffe_Lmdb - Fatal编程技术网

Python 将LMDB复制到另一个LMDB可减少文件大小

Python 将LMDB复制到另一个LMDB可减少文件大小,python,caffe,lmdb,Python,Caffe,Lmdb,在已经存在的lmdb()中洗牌数据。我检索了数据,洗牌并写回新的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

在已经存在的lmdb()中洗牌数据。我检索了数据,洗牌并写回新的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]);
代码的参考取自。
任何建议/想法都会有帮助。

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

这是相当常见的。旧数据库可能由于删除了项目而浪费了空间。这就是为什么数据库具有类似SQLite真空的功能。对于某些数据库,旧数据库中也可能存在新数据库中不存在的索引,这会占用磁盘空间,但看起来lmdb不允许您指定索引内容。我尝试在循环中重复上述过程,lmdb文件大小变为“0”。所以我认为删除的不是浪费空间,而是数据被删除了,我不明白。是的,这很奇怪。在对游标进行迭代之前,您是否尝试过调用游标.first()?不,我没有使用游标.first()。我认为使用它将导致光标位置更改为第一条记录。您能否提供一个关于如何使用
mdb_stat
的更详细示例?mdb_stat-fear将为您提供有关免费列表使用情况、环境信息、所有子数据库和当前需要编译的读者mdb_stat的信息。C实现可在