调整级别DB存储时要考虑的主要因素是什么?
我正在以形式插入500m 记录:
- key =" RS1234576543" 非常可预测的结构。RS< 1 数字>
- value =" 1,20000,a,c" 字符串可能更长,但通常〜40 chars
- 钥匙是唯一的
- 密钥插入顺序是随机的
使用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()
我已经尝试了各种批量的大小,这很有帮助,但是希望我错过了其他东西。例如,可以利用键(或值)的最大长度吗?
(在这里plyvel作者。)
LevelDB按顺序保留所有数据库项目。由于您以随机顺序编写,因此基本上意味着数据库的所有部分都会一直重写,因为LevelDB必须合并SST(这发生在后台)。一旦您的数据库变大了,并且您不断向其添加更多项目,这将导致写入吞吐量减少。
我怀疑,如果您的写入更好的地方,表现不会那么严重。
其他可能值得尝试的想法是:
- 增加
write_buffer_size
- 增加
max_file_size
- 较大的
block_size
实验 - 使用
.write_batch(sync=False)
以上所有关键字参数都可以从Python使用到plyvel.DB
和.write_batch()
方法。有关详细信息,请参见API文档。