2

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

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

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

所需的性能特征如下:

  1. 字符串被批量写入磁盘。编写完成后,它们很少被修改。大多数时候,它们只是只读的。
  2. 字符串被写入磁盘只是作为将它们移出 RAM 的一种方式。为了性能,将所有字符串同时保存在 RAM 中会打败这个人。理想情况下,我可以指定要占用多少 RAM 作为缓存。
  3. 耐用性并不重要。我不在乎写缓存是否需要很长时间。事实上,我只关心超过上面(2)中指定的缓冲区大小时才将字符串写入磁盘。例如,如果磁盘上有十亿个字符串,并将其中的一千个保留在 RAM 中(作为我的缓冲区大小),我可以接受直到第一个千零一字符串才写入磁盘分配。

到目前为止,我所研究的几乎每个系统,memcached、redis、leveldb、闪电、来自 sqlite 4 的 LSM,都解决了不同的问题。有些解决了确保事物持久耐用的问题,因此有很多事情要做以确保事物防崩溃。显然,就我而言,我不关心防撞的东西。我的应用程序将在应用程序启动时重新创建数据存储。如果我的应用程序崩溃,我不在乎磁盘上剩下的内容。还有其他的(例如 memecached)通过将东西放在 RAM 中来优化磁盘性能。它解决的问题几乎与我需要解决的问题相反。

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

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

所以我很好奇 RocksDB 团队中是否有人愿意给我一些指导。如果我能做到这一点,我将非常感激,并且一定会在线帮助其他人解决相同类型的问题。

4

1 回答 1

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 端口.net 包装器)。

于 2016-06-10T10:25:45.780 回答