Cap'n Proto:将大消息分段写入磁盘

Cap'n Proto: Piecewise write large message to disk

我想创建一个巨大的打包数据阵列,并将其保存在磁盘上。我正在使用 writePackedMessageToFd()。但是,由于输入数据非常大 (50GB),我需要将消息片段写入磁盘以释放内存。

当前版本的 Cap'n Proto 是否可行?

旁注:这个问题与提到的重复问题不同,因为输出不需要流式传输,例如理论上可能还有其他选项,例如在第一遍中保存整个(未完成的)消息的不断增长的文件。第二遍可以完成消息。

您所描述的可能并不完全正确。从磁盘读取打包消息时,您必须预先读取并解压整个消息,这将需要足够的物理 RAM 来容纳整个解压消息。

您有两个选择:

  1. 将消息分成许多块。 Cap'n Proto 消息是自定界的,因此您可以一次将多条消息写入一个文件,然后以相同的顺序一次读取一条消息。

  2. 不要使用压缩格式。如果邮件未打包,则可以 mmap()。然后,操作系统会在访问部分时将它们读入内存,并在需要时将它们从内存中刷新出来。在这种情况下,读取是微不足道的,但最初写入文件是棘手的。据推测,写入文件 的进程在内存中没有 space 整个文件。 Cap'n Proto 当前不支持通过 mmap 写入(可写 mmap 是有问题的),但通常您可以使用另一个技巧:可能,您的消息的大块实际上直接来自某些输入文件,即消息嵌入了巨大的字节来自其他文件的 blob。在这种情况下,您可以在每个文件中使用 mmap(),然后您可以使用 capnp::Orphanage::referenceExternalData() 将它们合并到消息中。这样文件就不必同时驻留在内存中; OS 将在写入最终输出时按顺序将每个页进页出。