RocksDB

时间:2016-05-21 21:58:40

标签: database sqlite key-value-store leveldb rocksdb

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

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

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

所需的性能特征如下:

  1. 正在将字符串批量写入磁盘。写完之后,它们很少被修改。大多数时候,它们只是只读。
  2. 字符串仅作为将其移出RAM的方式写入磁盘。为了性能,将所有字符串同时保存在RAM中会打败这个人。理想情况下,我可以指定占用多少RAM作为缓存。
  3. 耐用性并不重要。我不在乎写缓存需要很长时间。实际上,我只关心在超出上面(2)中指定的缓冲区大小时写入磁盘的字符串。例如,如果磁盘上有十亿个字符串,并且在RAM中保留了一千个字符串(作为我的缓冲区大小),那么千万不会写入磁盘,直到第一千一个字符串为止。分配
  4. 我到目前为止看到的每个系统,memcached,redis,leveldb,闪电,来自sqlite 4的LSM,都解决了不同的问题。有些解决了确保持久耐用的问题,所以有很多事情要确保防止碰撞。显然在我的情况下,我并不关心防撞事件。我的应用程序将在应用程序启动时重新创建数据存储。如果我的应用程序崩溃,我不关心磁盘上剩下的内容。还有一些(比如memecached)通过先把东西放在RAM中来优化磁盘性能。它正在解决一个与我需要解决的问题几乎完全相反的问题。

    最终,由于这是一个64位系统,我希望系统使用内存映射文件进行优化。

    RocksDB最接近我认为我需要使用的工具,但它是一个非常混乱和复杂的系统,有一百万个设置。此外,我的特定情况不在其发布的任何“食谱”中。

    所以我很好奇来自RocksDB团队的人是否愿意给我一些指导。如果我可以让这个工作,我将非常感激,并肯定会帮助其他人在线解决相同类型的问题。

1 个答案:

答案 0 :(得分:0)

我说你不​​需要将数据移动到磁盘上,但不需要耐用性。

除此之外,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)。