gpt4 book ai didi

c++ - 船长原型(prototype) : Piecewise write large message to disk

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:34 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

你有两个选择:

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

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

关于c++ - 船长原型(prototype) : Piecewise write large message to disk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com