LevelDB的亿万条目

时间:2019-03-01 09:13:07

标签: python leveldb plyvel

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

我要插入500M +条记录,格式为:

  1. key =“ rs1234576543” 非常可预测的结构。 rs <1+个数字>
  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()

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

1 个答案:

答案 0 :(得分:2)

(此处是Plyvel的作者。)

LevelDB将所有数据库项保持在已排序的顺序中。由于您是以随机顺序编写的,因此从根本上来说,这意味着自从LevelDB必须合并SST以来,数据库的所有部分都会一直被重写(这在后台发生)。一旦数据库变大,并继续向其中添加更多项,这将导致写吞吐量降低。

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

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

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

以上所有内容都可以在Python上使用,只需使用plyvel.DB.write_batch()方法的额外关键字参数即可。有关详细信息,请参见api docs