我想使用RocksDB的方式我认为是不寻常的。我想用它来降低内存中有大量字符串的应用程序的内存压力。原因是因为应用程序最终会扩展到这样的程度,否则它将需要几十GB的RAM来存储所有字符串。这是一个64位的应用程序,部分用C++编写,部分用VB .NET编写(我知道,我知道。)
我的任务是把所有的字符串移到磁盘上。
我希望尽可能的高性能。当然我可以使用SQLite之类的东西,但是我真的一点都不需要SQL。我只需要一个键/值存储。键可以是一个32位的int,值将是一个字符串。典型的字符串长度为1 K到5 K。
要求的性能特征如下:
1.字符串被批量写入磁盘。写入后,它们很少被修改。大多数时候,它们只是只读的。
1.字符串被写入磁盘只是为了将它们移出RAM。为了性能,将所有字符串同时保存在RAM中会使人失败。理想情况下,我可以指定要占用多少RAM作为缓存。
1.持久性并不重要,我不关心写缓存是否需要很长时间,实际上,我只关心只有当中指定的缓冲区大小(2)超过了上面的限制。例如,如果磁盘上有十亿个字符串,而RAM中有一千个字符串(作为我的缓冲区大小),我可以接受在分配第1001个字符串之前不将1000个字符串写入磁盘。
到目前为止,我研究过的几乎所有系统,memcached、redis、leveldb、lightning、sqlite 4的LSM,都解决了不同的问题。有些解决了确保持久性的问题,所以有很多工作要做,以确保东西不会崩溃。显然,在我的情况下,我不关心是否防崩溃。我的应用程序将在启动时重新创建数据存储。如果我的应用程序崩溃,我不关心磁盘上剩下的内容,还有一些(比如memecached)是为了优化磁盘性能,先把东西放到RAM中,它解决的问题几乎与我需要解决的问题相反。
最后,由于这是一个64位系统,我希望系统使用内存Map文件进行优化。
RocksDB最接近我认为我需要使用的工具,但它是一个非常混乱和复杂的系统,有一百万个设置。此外,我的特定场景不在它发布的任何“食谱”中。
所以我很好奇RocksDB团队有没有人愿意给予我一些指导,如果我能让这一点发挥作用,我会非常感激,也一定会在网上帮助其他人解决同类型的问题。
2条答案
按热度按时间zhte4eai1#
我不太明白你说你需要把数据移到磁盘上,但不需要耐用性。
除此之外,leveldb将是一个很好的选择:
你没有指定platform,但是它是linux自带的,或者你可以在windows上使用windows port(.net wrappers)。
xghobddn2#
Sqlite Index Blaster正是为此目的而开发的-〉一次性插入物牺牲了耐用性以获得性能。
它使用LRU缓存,因此可以指定使用多少RAM来调整性能。
它可以用作键-值存储或常规的聚集索引表存储。
它以最流行的Sqlite格式存储数据。
免责声明:我是这个回购协议的作者。