LevelDB,有100秒的数百万个条目



调整级别DB存储时要考虑的主要因素是什么?

我正在以形式插入500m 记录:

  1. key =" RS1234576543" 非常可预测的结构。RS< 1 数字>
  2. value =" 1,20000,a,c" 字符串可能更长,但通常〜40 chars
  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()

我已经尝试了各种批量的大小,这很有帮助,但是希望我错过了其他东西。例如,可以利用键(或值)的最大长度吗?

(在这里plyvel作者。)

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

我怀疑,如果您的写入更好的地方,表现不会那么严重。

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

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

以上所有关键字参数都可以从Python使用到plyvel.DB.write_batch()方法。有关详细信息,请参见API文档。

最新更新