【发布时间】:2020-02-29 22:07:04
【问题描述】:
我想读取存储在 RocksDB 中的非常大的值。可以分部分读吗? 就像将文件的内容读入固定缓冲区...
例如,我有一个 500 MB 的值,这是一个 zlib 压缩文件。由于这是一个服务器程序,我不能为每个连接分配 500 MB(500 MB 的价值,无论如何可能更多,还有 SSL 上下文、身份验证信息等......)。
而且,这个值对协议有意义,所以我不能把它分开。 根据文档,值大小必须小于 3GB。我认为没有任何服务器程序为单个连接分配这个大小。
我可以提一些有用的例子:
- 在 RocksDB 之上创建文件系统
- 在消息应用程序中存储声音、图像、视频等
假设这样一个例子:
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 的部分,并使用前缀扫描来重建价值。这是前缀扫描存在的原因吗?我在回答我自己的问题吗?使用此标准是否会因为多个键而增加空间使用量?
-
这不是和你原来的问题有点不同吗?根据您的评论,我的理解是您计划将相同的数据划分为固定大小的块,并在具有公共前缀的多个键下(例如
testkey1、testkey2、...、testkeyN)。那是对的吗?根据您的问题,现在将 500MB 分成多个块。