调整LevelDB存储的插入时要考虑的主要因素是什么?
我要插入500M +条记录,格式为:
使用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()
我尝试了各种批处理大小,这会有所帮助,但是希望还有其他我错过的东西。例如,可以利用已知键(或值)的最大长度吗?
答案 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。