调整 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()
Run Code Online (Sandbox Code Playgroud)
我尝试过各种批量大小,这有点帮助,但我希望还有其他东西我错过了。例如,可以利用知道键(或值)的最大长度吗?
(Plyvel 作者在这里。)
LevelDB 将所有数据库项目按排序顺序保存。由于您是以随机顺序写入的,这基本上意味着数据库的所有部分都会被重写,因为 LevelDB 必须合并 SST(这发生在后台)。一旦数据库变得更大,并且不断向其中添加更多项目,就会导致写入吞吐量降低。
我怀疑如果您的写入具有更好的局部性,性能不会下降得那么严重。
其他可能值得尝试的想法是:
write_buffer_sizemax_file_sizeblock_size.write_batch(sync=False)上述内容都可以通过 Python 使用方法的额外关键字参数来plyvel.DB使用.write_batch()。有关详细信息,请参阅api 文档。