体积较大且含列族的RocksDB数据库无法获取所有key问题求解
问题原因
你调用db.iterkeys()时未指定列族,RocksDB默认只会遍历内置的default列族,你的数据全部存储在自定义的列族中,默认列族本身没有数据,因此得到空列表。
正确实现代码
import rocksdb db_path = "db" # 先读取数据库中已存在的所有列族,避免手动配置漏写/错写 existing_cf_names = rocksdb.list_column_families(db_path, rocksdb.Options()) cf_descriptors = [(name, rocksdb.ColumnFamilyOptions()) for name in existing_cf_names] # 打开数据库,同时获取所有列族的操作句柄 db, cf_handles = rocksdb.DB.open( db_path, rocksdb.Options(create_if_missing=False), column_families=cf_descriptors ) all_keys = [] # 遍历每一个列族,分别读取该列族下的所有key for cf_handle in cf_handles: it = db.iterkeys(column_family=cf_handle) it.seek_to_first() all_keys.extend(list(it)) # 输出前10个key for idx, key in enumerate(all_keys): print(key) if idx == 9: break db.close()
核心注意点
- 读取多列族RocksDB的key时,必须给
iterkeys()传入column_family参数指定对应的列族句柄,否则只会读取默认列族的数据 - 建议先用
list_column_families接口拉取数据库实际存在的列族列表,不要手动硬编码列族名称,避免出现拼写错误、漏写列族的问题 - 不同列族的key相互独立,需要分别遍历每个列族的迭代器,汇总后才能得到整个数据库的全部key
内容的提问来源于stack exchange,提问作者Aviral Srivastava
相关产品推荐
相关产品推荐

