c++ - 按文件夹名称存储键值

标签 c++ key-value-store b-tree-index

我们有自己的内部 noSQL 数据库,它基本上将所有内容存储在一个紧凑的二进制文件中。现在,我需要一种类似于键值存储或 B+Tree 的数据结构。在我的例子中,问题是“值(value)”可以是不同的类型,并且大小非常不稳定,可以从 1Kb 到 1-2Gb。通常键是字符串,值是数据流,可以是int、string或自定义类型的流。

我正在考虑实现一个 B+ 树,但这并不容易,因为 B+ 树需要“值”是同一类型,并且“值”的大小应该足够小以便可以存储在相对较小的堵塞。可能有一个变体,但我没有找到有关如何实现 B+ 树的教程,其中包含显示如何存储在磁盘上的示例。我看到的大部分教程都只是内存中的 B+ 树。

然后我有了使用文件夹/文件名作为键的想法。然后该值可以是文件中的任何内容。然后值可以是任意大小,这正是我想要的。所以我的问题在这里,在极端情况下,

  • 不同日期的数据存储在不同的文件夹中
  • 我可以将 1M-50M key (实际上是文件/文件夹)在磁盘上存储几天
  • 对文件的数据操作通常是“只读”的,并且在白天是“附加到”。历史数据永远不会被修改。

我已经看到我可以在现代操作系统上拥有约 40 亿个文件,所以我很满意这种在单台机器上存储约 2 年的方法。我只是担心这种实现键值存储的方式是否很糟糕?为什么?处理文件系统时我会遇到什么问题? (例如,Windows 上的 Frameded 磁盘?)

在 Windows/Linux 中,所有这些都是用 C++ 实现的。

最佳答案

我想,如果你能确保并满足你的要求,那应该不错。 我为一个嵌入式项目及其有限的数据集做了类似的事情。

需要考虑的事情

  1. 操作系统/文件系统应支持所需的文件夹长度( key )和文件名(您如何选择)
  2. 它确实会使磁盘碎片化,并且可能会延迟对巨大目录结构的磁盘访问。这可能会影响整个系统进程。
  3. 应用程序性能可能会下降,因为读/写操作取决于文件操作 - 如果需要,您可能可以在程序中添加缓存。
  4. 不利于多线程应用,应注意文件锁定。
  5. 应注意安全。

关于c++ - 按文件夹名称存储键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436360/

相关文章:

c++ - C++ 核心库的编译错误

c++ - 使用 SetupDiGetDeviceRegistryProperty 获取驱动器类型

c++ - boost::variate_generator 语法错误

c++ - 编译 C++ 程序

mysql - MySQL 如何遍历复合 B 树索引以进行 IN() 和 IN() 搜索

php - 遍历B树结构算法

php - 值列表 : Code constants or database?

python - 在redis中存储带或不带散列的键值对

java - 列表作为键值存储的键

postgresql - postgres中解释的索引和过滤器部分中的 boolean 列