c – Cap’n Proto:分段向磁盘写入大消息

我想创建一个巨大的打包数据数组,并将其保存在磁盘上.我正在使用writePackedMessageToFd().但是,由于输入数据太大(50GB),我需要将消息片断到磁盘以释放内存.

当前版本的Cap’n Proto可以实现吗?

附注:此问题与提及的重复问题的不同之处在于输出不需要流式传输,例如理论上可以有其他选项,例如在第一遍中保存整个(未完成)消息的增长文件.第二遍可以完成这个消息.

最佳答案 你所描述的正好可能无法奏效.从磁盘读取打包消息时,必须事先读取并解压缩整个消息,这将需要足够的物理RAM来保存整个解压缩的内容.

您有两种选择:

>将消息分成许多块. Cap’n Proto消息是自定界限的,因此您可以一次一个地向文件写入多条消息,然后以相同的顺序一次一条地读回一条消息.
>不要使用打包格式.如果邮件未打包,则可以mmap()它.然后,操作系统将在访问时将部件读入内存,并在以后根据需要将其冲洗回内存.在这种情况下,读取是微不足道的,但最初编写文件是棘手的.据推测,编写文件的过程也没有内存中整个文件的空间. Cap’n Proto目前不支持通过mmap编写(可写mmap是有问题的),但通常还有另一个技巧:可能大部分消息实际上直接来自某些输入文件,即消息嵌入了大字节来自其他文件的blob.在这种情况下,您可以在每个文件中使用mmap(),然后可以使用capnp :: Orphanage :: referenceExternalData()将它们合并到消息中.这样,文件不必全部同时驻留在内存中;在写入最终输出时,操作系统将按顺序进出每个页面. See this answer for more details and some example code.

点赞