C++ 分块读取rocksdb中的值

C++ 分块读取rocksdb中的值,c++,rocksdb,C++,Rocksdb,我想读取rocksdb中存储的一个非常巨大的值。可以一部分一部分地读吗? 就像将文件内容读入固定缓冲区一样 例如,我有一个500 MB的值,这是一个zlib压缩文件。由于这是一个服务器程序,我不能为每个连接分配500 MB(500 MB的值,无论如何可能更大,以及SSL上下文、身份验证信息等等) 而且,这个值对协议有意义,所以我不能把它分开。 根据文档,值大小必须小于3GB。我认为没有任何服务器程序为单个连接分配这种大小 我可以举出一些有用的例子: 在RocksDB上创建文件系统 存储声音、图像

我想读取rocksdb中存储的一个非常巨大的值。可以一部分一部分地读吗? 就像将文件内容读入固定缓冲区一样

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

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

我可以举出一些有用的例子:

  • 在RocksDB上创建文件系统
  • 存储声音、图像、视频,。。。在消息传递应用程序中
  • 假设这样一个例子:

    切片部分切片;
    db->Get(选择“ac154df568bb874”和部分片,256*1024);//一次读取256KB
    socket.write(partialSlice.data(),256*1024);
    while(部分剩余部分){
    ///重新绘制以获取所有数据。。。
    }
    
    检查。对于这种情况,这似乎是一个很好的解决方案

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


    另一种解决办法可以是:


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

    该值的大小是多少?根据文件。你需要为你的问题添加更多的上下文。也添加相关代码。请检查我的评论中链接中的
    pinnablesicle
    。这与你的问题更相关。这个链接指向哪个更详细,看起来像是你所需要的。你可以从这个链接创建块,然后处理这些块-就地或在创建副本之后。检查一下。让我知道这是否解决了您的问题,以便我可以发布一个整合的答案。不幸的是,没有。我想我必须将其分块到256KB的部分,例如,并使用前缀扫描重建值。这就是存在前缀扫描的原因吗?我在回答我自己的问题吗?使用此标准是否会因为多个键而增加空间使用率?这与您最初的问题是否有点不同?从您的评论中,我了解到您计划将相同的数据分成固定大小的块,在多个具有公共前缀的键下(例如,
    testkey1
    testkey2
    ,…,
    testkeyN
    )。对吗?根据您的问题,500MB现在将被分为多个块。