LevelDB 可容纳数百个数百万条目

puf*_*ish 4 python leveldb

调整 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()
Run Code Online (Sandbox Code Playgroud)

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

wou*_*lee 5

(Plyvel 作者在这里。)

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

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

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

  • 增加write_buffer_size
  • 增加max_file_size
  • 尝试更大的block_size
  • 使用.write_batch(sync=False)

上述内容都可以通过 Python 使用方法的额外关键字参数来plyvel.DB使用.write_batch()。有关详细信息,请参阅api 文档。