【发布时间】:2016-05-21 21:58:40
【问题描述】:
我想使用 RocksDB 的方式很不寻常。我想用它来降低内存中有大量字符串的应用程序的内存压力。原因是应用程序最终会扩展到需要数十 GB 的 RAM 来存储所有字符串的程度。这是一个仅限 64 位的应用程序,部分用 C++ 编写,部分用 VB.NET(我知道。我知道。)
我的任务是将所有字符串移到磁盘上。
我希望尽可能高效。当然我可以使用 SQLite 之类的东西,但我真的根本不需要 SQL。我只需要一个键/值存储。键可以是 32 位 int,值是字符串。典型的字符串长度为 1K 到 5K。
所需的性能特征如下:
- 字符串正在批量写入磁盘。编写完成后,它们很少被修改。大多数情况下,它们只是只读的。
- 将字符串写入磁盘只是为了将它们移出 RAM。为了性能,将所有字符串同时保存在 RAM 中会打败这个人。理想情况下,我可以指定占用多少 RAM 作为缓存。
- 耐用性并不重要。我不在乎写缓存是否需要很长时间。事实上,我只关心超过上面(2)中指定的缓冲区大小时才将字符串写入磁盘。例如,如果磁盘上有十亿个字符串,并将其中的一千个保存在 RAM 中(作为我的缓冲区大小),我可以接受直到第 100 个字符串才写入磁盘已分配。
到目前为止,我所研究的几乎所有系统,memcached、redis、leveldb、闪电、来自 sqlite 4 的 LSM,都解决了不同的问题。有些解决了确保事物持久耐用的问题,因此有很多事情要做以确保事物防崩溃。显然,就我而言,我不关心防撞的东西。我的应用程序将在应用程序启动时重新创建数据存储。如果我的应用程序崩溃,我不在乎磁盘上剩下的内容。还有其他的(例如 memecached)通过将东西放在 RAM 中来优化磁盘性能。它解决的问题几乎与我需要解决的问题相反。
最终,由于这是一个 64 位系统,我希望系统使用内存映射文件进行优化。
RocksDB 最接近我认为我需要使用的工具,但它是一个非常令人困惑和复杂的系统,具有一百万个设置。此外,我的具体情况不在其发布的任何“食谱”中。
所以我很好奇 RocksDB 团队中是否有人愿意给我一些指导。如果我能做到这一点,我将非常感激,并且一定会在线帮助其他人解决相同类型的问题。
【问题讨论】:
-
我认为仅仅使用 RocksDB 并不能解决您的问题,您需要结合使用 memcached 和 RocksDB,将 RocksDB 用作“数据库”,将 memcached 用作“缓存”。
-
为什么不用文件系统?
标签: database sqlite key-value-store leveldb rocksdb