【问题标题】:An Unusual use of RocksDBRocksDB 的不寻常使用
【发布时间】:2016-05-21 21:58:40
【问题描述】:

我想使用 RocksDB 的方式很不寻常。我想用它来降低内存中有大量字符串的应用程序的内存压力。原因是应用程序最终会扩展到需要数十 GB 的 RAM 来存储所有字符串的程度。这是一个仅限 64 位的应用程序,部分用 C++ 编写,部分用 VB.NET(我知道。我知道。)

我的任务是将所有字符串移到磁盘上。

我希望尽可能高效。当然我可以使用 SQLite 之类的东西,但我真的根本不需要 SQL。我只需要一个键/值存储。键可以是 32 位 int,值是字符串。典型的字符串长度为 1K 到 5K。

所需的性能特征如下:

  1. 字符串正在批量写入磁盘。编写完成后,它们很少被修改。大多数情况下,它们只是只读的。
  2. 将字符串写入磁盘只是为了将它们移出 RAM。为了性能,将所有字符串同时保存在 RAM 中会打败这个人。理想情况下,我可以指定占用多少 RAM 作为缓存。
  3. 耐用性并不重要。我不在乎写缓存是否需要很长时间。事实上,我只关心超过上面(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


【解决方案1】:

我不太明白你说需要将数据移动到磁盘但不需要持久性的部分。

除此之外,leveldb 将是一个不错的选择:

*fast writes
*ability to do atomic bulk insert (WriteBatch)
*low memory footprint
*fast key lookup (and fast iterator to read adjacent data)

您没有指定平台,但它在 linux 上是原生的,或者您可以在 windows 上使用 windows port (.net wrappers)。

【讨论】:

  • Windows 是平台。
  • 持久性是为了保证系统出现故障时数据不丢失。我不需要那个,因为无论如何这是在 RAM 中的数据。我需要将它放入数据库中以保存在 RAM 上,而不是我关心数据在重启后是否保持不变。
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2015-10-29
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多