11

我有一个关于 FileSystem 使用的基本问题,我想使用嵌入式 KeyValue 存储,它非常面向写入。(持久)假设我的值大小是 a) 10 K b) 1 M 并且读取和更新的数量相等

我不能简单地创建包含值和名称的文件作为键。

不会像使用 LevelDB 或 RocksDB 那样的 KeyValue 存储一样快。

谁能帮我理解。

4

1 回答 1

22

原则上,是的,文件系统可以用作键值存储。仅当您查看实现中的单个用例和限制时,才会出现差异。

此处不赘述,有些事情可能会有很大不同:

  • 文件系统将数据拆分为固定大小的块。两个文件通常不能占据同一块的一部分。常见的块大小为 4-16 KiB;您可以计算出您的 10 KiB 示例会导致多少开销。键/值存储倾向于考虑较小尺寸的数据。
  • 文件系统中的目录索引通常无法按排序顺序有效地迭代文件名/键。您可以有效地查找特定键,但如果不读取几乎所有目录条目,则无法检索范围。一些键/值存储,包括 LevelDB,支持高效的有序迭代。
  • 一些键/值存储,包括 LevelDB,是事务性的。这意味着您可以将多个更新捆绑在一起,LevelDB 将确保所有这些更新都通过,或者它们都不通过。这对于防止数据不一致非常重要。文件系统使这更难实现,尤其是在涉及多个文件时。
  • 键/值存储通常尝试在磁盘上保持数据连续(因此可以通过更少的查找来检索数据),而现代文件系统故意不跨文件执行此操作。在读取许多记录时,这会严重影响性能。不过,这在固态磁盘上不是问题。
  • 虽然某些文件系统确实提供了压缩功能,但它们通常是按文件或按块的。据我所知,LevelDB 压缩了整个记录块,可能会产生更好的压缩效果(尽管他们的压缩策略偏向于性能而不是压缩效率)。
于 2014-09-07T23:45:53.743 回答