【问题标题】:Read value in rocksdb in chunks以块的形式读取rocksdb中的值
【发布时间】:2020-02-29 22:07:04
【问题描述】:

我想读取存储在 RocksDB 中的非常大的值。可以分部分读吗? 就像将文件的内容读入固定缓冲区...

例如,我有一个 500 MB 的值,这是一个 zlib 压缩文件。由于这是一个服务器程序,我不能为每个连接分配 500 MB(500 MB 的价值,无论如何可能更多,还有 SSL 上下文、身份验证信息等......)。

而且,这个值对协议有意义,所以我不能把它分开。 根据文档,值大小必须小于 3GB。我认为没有任何服务器程序为单个连接分配这个大小。

我可以提一些有用的例子:

  1. 在 RocksDB 之上创建文件系统
  2. 在消息应用程序中存储声音、图像、视频等

假设这样一个例子:

Slice partialSlice;
db->Get(opt,"ac154df568bb874", &partialSlice, 256*1024);  /// read 256KB at once
socket.write(partialSlice.data(), 256*1024);
while(partialSlice.HaveRemaining) {
   /// repate it to get all of data...
}

【问题讨论】:

  • that 值的大小是多少?根据文档,value size must be smaller than 4GB。您需要为您的问题添加更多上下文。也添加您的相关代码。
  • 检查我评论链接中的PinnableSlice。这与您的问题更相关。该链接指向this,它更详细,看起来正是您所需要的。
  • 您可以从这里创建块并处理这些块 - 就地或创建副本之后。检查example。如果这能解决您的问题,请告诉我,以便我发布综合答案。
  • 很遗憾没有。例如,我认为我必须将其分块为 256KB 的部分,并使用前缀扫描来重建价值。这是前缀扫描存在的原因吗?我在回答我自己的问题吗?使用此标准是否会因为多个键而增加空间使用量?
  • 这不是和你原来的问题有点不同吗?根据您的评论,我的理解是您计划将相同的数据划分为固定大小的块,并在具有公共前缀的多个键下(例如testkey1testkey2、...、testkeyN)。那是对的吗?根据您的问题,现在将 500MB 分成多个块。

标签: c++ rocksdb


【解决方案1】:

检查PinnableSlice。对于这种情况,这似乎是一个很好的解决方案。

简单地说,获取值的一部分,分块处理它(没有内存开销;请参阅限制部分),然后就完成了。也许,您已经有一个函数可以接受原始内存进行解压,以避免输入数据的内存开销。


另一种解决方案可能是:

根据密钥存储压缩文件的路径/句柄,在需要时检索它并进行处理。此处的延迟需要在文件的磁盘 I/O 和数据库中的内存版本的情况下进行测量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2012-04-17
    • 2013-03-05
    • 2018-04-06
    • 1970-01-01
    • 2012-04-18
    • 2022-09-27
    • 2016-05-27
    相关资源
    最近更新 更多