数以百万计条目的 LevelDB
LevelDB for 100s of millions entries
为 LevelDB 存储调整插入时要考虑的首要因素是什么?
我要插入 5 亿多条记录,格式如下:
- key="rs1234576543" 非常可预测的结构。 rs<1+ 位>
- value="1,20000,A,C" 字符串可以更长,但通常为 ~ 40 个字符
- 键是唯一的
- 密钥插入顺序是随机的
使用 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 docs。
为 LevelDB 存储调整插入时要考虑的首要因素是什么?
我要插入 5 亿多条记录,格式如下:
- key="rs1234576543" 非常可预测的结构。 rs<1+ 位>
- value="1,20000,A,C" 字符串可以更长,但通常为 ~ 40 个字符
- 键是唯一的
- 密钥插入顺序是随机的
使用 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 docs。