LevelDB用于处理数亿条记录

4
考虑调整LevelDB存储的插入时要考虑的最重要因素是什么?
我正在以以下形式插入5亿多条记录:
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()

我尝试过不同的批次大小,这有一定帮助,但我希望还有其他方法。例如,是否可以利用键(或值)的最大长度?"最初的回答"

看起来按键对批次进行排序会有很大的影响。 - pufferfish
1个回答

5
(我是Plyvel的作者)
LevelDB将所有数据库项按排序顺序保存。因为你是随机写入的,这基本上意味着由于LevelDB必须合并SSTs(这在后台发生),数据库的所有部分都会一直被重写。一旦你的数据库变得更大,并且你继续添加更多的项,这会导致写吞吐量降低。
我怀疑如果你有更好的写入位置,则性能不会降低得那么厉害。
其他可能值得尝试的想法包括:
- 增加write_buffer_size - 增加max_file_size - 尝试使用较大的block_size - 使用.write_batch(sync=False) 上述内容都可以通过向plyvel.DB.write_batch()方法添加关键字参数在Python中使用。有关详细信息,请参见api文档

在所有写入完成后,是否可以对数据库进行排序?或者可以将多个LevelDB写入并稍后合并它们吗? - demonguy
排序和合并是像leveldb这样的日志结构合并树(LSM树)设计的本意。外部化这个过程可能不会给您带来任何好处。 - wouter bolsterlee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接