我们有自己的内部 noSQL 数据库,它基本上将所有内容存储在一个紧凑的二进制文件中。现在,我需要一种类似于键值存储或 B+Tree 的数据结构。在我的例子中,问题是“值(value)”可以是不同的类型,并且大小非常不稳定,可以从 1Kb 到 1-2Gb。通常键是字符串,值是数据流,可以是int、string或自定义类型的流。
我正在考虑实现一个 B+ 树,但这并不容易,因为 B+ 树需要“值”是同一类型,并且“值”的大小应该足够小以便可以存储在相对较小的堵塞。可能有一个变体,但我没有找到有关如何实现 B+ 树的教程,其中包含显示如何存储在磁盘上的示例。我看到的大部分教程都只是内存中的 B+ 树。
然后我有了使用文件夹/文件名作为键的想法。然后该值可以是文件中的任何内容。然后值可以是任意大小,这正是我想要的。所以我的问题在这里,在极端情况下,
- 不同日期的数据存储在不同的文件夹中
- 我可以将 1M-50M key (实际上是文件/文件夹)在磁盘上存储几天
- 对文件的数据操作通常是“只读”的,并且在白天是“附加到”。历史数据永远不会被修改。
我已经看到我可以在现代操作系统上拥有约 40 亿个文件,所以我很满意这种在单台机器上存储约 2 年的方法。我只是担心这种实现键值存储的方式是否很糟糕?为什么?处理文件系统时我会遇到什么问题? (例如,Windows 上的 Frameded 磁盘?)
在 Windows/Linux 中,所有这些都是用 C++ 实现的。
最佳答案
我想,如果你能确保并满足你的要求,那应该不错。 我为一个嵌入式项目及其有限的数据集做了类似的事情。
需要考虑的事情
- 操作系统/文件系统应支持所需的文件夹长度( key )和文件名(您如何选择)
- 它确实会使磁盘碎片化,并且可能会延迟对巨大目录结构的磁盘访问。这可能会影响整个系统进程。
- 应用程序性能可能会下降,因为读/写操作取决于文件操作 - 如果需要,您可能可以在程序中添加缓存。
- 不利于多线程应用,应注意文件锁定。
- 应注意安全。
关于c++ - 按文件夹名称存储键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436360/