【问题标题】:LevelDB for 100s of millions entriesLevelDB 用于数以亿计的条目
【发布时间】:2019-03-01 09:13:07
【问题描述】:

在调整 LevelDB 存储的插入时要考虑的首要因素是什么?

我在表单中插入了 500M+ 条记录:

  1. key="rs1234576543" 非常可预测的结构。 rs
  2. value="1,20000,A,C" 字符串可以更长,但通常约为 40 个字符
  3. 键是唯一的
  4. 密钥插入顺序是随机的

使用 python plyvel 进入 LevelDB 存储,随着记录数量的增加,速度会急剧下降。我想这是意料之中的,但我是否可以考虑一些调整措施以使其更好地扩展?

示例代码:

import plyvel
BATCHSIZE = 1000000

db = plyvel.DB('/tmp/lvldbSNP151/', create_if_missing=True)
wb = db.write_batch()
# items not in any key order
for key, value in DBSNPfile:
    wb.put(key,value)
    if i%BATCHSIZE==0:
        wb.write()
wb.write()

我尝试了各种批量大小,这有点帮助,但我希望还有一些我错过的东西。例如,可以利用知道键(或值)的最大长度吗?

【问题讨论】:

  • 看起来按键排序有很大的不同

标签: python leveldb


【解决方案1】:

(此处为 Plyvel 作者。)

LevelDB 保持所有数据库项目的排序。由于您是以随机顺序编写的,这基本上意味着数据库的所有部分都会一直被重写,因为 LevelDB 必须合并 SST(这发生在后台)。一旦您的数据库变得更大,并且您不断向其中添加更多项目,这会导致写入吞吐量降低。

我怀疑,如果您的写入位置更好,性能不会下降那么严重。

其他可能值得尝试的想法是:

  • 增加write_buffer_size
  • 增加max_file_size
  • 用更大的block_size做实验
  • 使用.write_batch(sync=False)

以上内容都可以在 Python 中使用plyvel.DB.write_batch() 方法的额外关键字参数来使用。详情请见api docs

【讨论】:

  • 是否可以在所有写入完成后对数据库进行排序?还是可以写多个levelDB,以后合并?
  • 排序和合并实际上是 log 结构化合并树(lsm 树)如 leveldb 的设计目的。外化可能不会给你带来任何好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多