Cap'n Proto:分段将大型消息写入磁盘
Cap'n Proto: Piecewise write large message to disk
我想创建一个巨大的打包数据数组,并将其持久化在磁盘上。我正在使用writePackedMessageToFd((。但是,由于输入数据非常大(50GB(,我需要将消息片段到磁盘以释放内存。
这在当前版本的Cap'n Proto中可能吗?
旁注:这个问题与提到的重复问题不同,因为输出不需要流式传输,例如理论上可能还有其他选项,例如在第一次传递中保存整个(未完成(消息的不断增长的文件。第二次传递可以完成消息。
确切地说,你所描述的可能行不通。从磁盘读取打包的消息时,必须预先读取和解压缩整个消息,这将需要足够的物理 RAM 来保持整个消息的解压缩状态。
您有两种选择:
-
将消息分解为多个块。Cap'n Proto 消息是自定界的,因此您可以一次将多条消息写入文件一次,然后按相同的顺序一次读回一条。
-
不要使用打包格式。如果邮件未打包,则可以
mmap()
它。然后,操作系统将在访问部件时将其读入内存,并可以稍后根据需要将它们从内存中刷新。在这种情况下,读取是微不足道的,但最初写入文件是棘手的。据推测,写入文件的进程在内存中也没有容纳整个文件的空间。Cap'n Proto目前不支持通过mmap进行写入(可写mmap有问题(,但通常你可以做另一个技巧:可能,你的消息的大块实际上直接来自一些输入文件,即消息嵌入了来自其他文件的巨大字节blob。在这种情况下,您可以在每个文件中 mmap((,然后您可以使用capnp::Orphanage::referenceExternalData()
将它们合并到消息中。这样,文件不必同时驻留在内存中;操作系统将在写入最终输出时按顺序分页和逐出每个输出。有关更多详细信息和一些示例代码,请参阅此答案。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- boost::进程间消息队列引发错误
- C++中高效的大型稀疏块压缩线性方程
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- Cap'n Proto:分段将大型消息写入磁盘
- 带有大型消息的ZeroMQ:REQ/REP