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

Cap'n Proto: Piecewise write large message to disk

本文关键字:大型 消息 磁盘 分段 Proto Cap      更新时间:2023-10-16

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

这在当前版本的Cap'n Proto中可能吗?

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

确切地说,你所描述的可能行不通。从磁盘读取打包的消息时,必须预先读取和解压缩整个消息,这将需要足够的物理 RAM 来保持整个消息的解压缩状态。

您有两种选择:

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

  2. 不要使用打包格式。如果邮件未打包,则可以mmap()它。然后,操作系统将在访问部件时将其读入内存,并可以稍后根据需要将它们从内存中刷新。在这种情况下,读取是微不足道的,但最初写入文件是棘手的。据推测,写入文件的进程在内存中也没有容纳整个文件的空间。Cap'n Proto目前不支持通过mmap进行写入(可写mmap有问题(,但通常你可以做另一个技巧:可能,你的消息的大块实际上直接来自一些输入文件,即消息嵌入了来自其他文件的巨大字节blob。在这种情况下,您可以在每个文件中 mmap((,然后您可以使用 capnp::Orphanage::referenceExternalData() 将它们合并到消息中。这样,文件不必同时驻留在内存中;操作系统将在写入最终输出时按顺序分页和逐出每个输出。有关更多详细信息和一些示例代码,请参阅此答案。