问题标签 [capnproto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1725 浏览

c# - 使用 C# 将非常大的项目列表序列化到 Azure blob 存储中

我有大量对象需要稍后存储和检索。该列表将始终用作一个单元,并且不会单独检索列表项。该列表包含大约 7000 个项目,总计约 1GB,但很容易升级到十倍或更多。

我们一直用BinaryFormatter.Serialize()做序列化(System.Runtime.Serialization.Formatters.Binary.BinaryFormatter)。然后,此字符串作为 blob 上传到 Azure blob 存储。我们发现它通常快速高效,但是当我们使用更大的文件大小对其进行测试时,它变得不够了,抛出了OutOfMemoryException. 据我了解,虽然我使用的是流,但我的问题是该BinaryFormatter.Serialize()方法必须首先将所有内容序列化到内存中,然后才能上传 blob,从而导致我的异常。

二进制序列化程序如下所示:

OutOfMemoryException 发生formatter.Serialize(stream, value)在线上。

因此,我尝试使用不同的协议,Protocol Buffers。我尝试使用 Nuget 包 protobuf-net 和 Google.Protobuf 中的两种实现,但是序列化速度非常慢(大约 30 分钟),而且根据我的阅读,Protobuf 没有针对序列化大于 1MB 的数据进行优化。所以,我回到绘图板上,遇到了 Cap'n Proto,它承诺通过使用内存映射来解决我的速度问题。我正在尝试使用 @marc-gravell 的 C# 绑定,但我在实现序列化程序时遇到了一些困难,因为该项目还没有完整的文档。此外,我不能 100% 确定 Cap'n Proto 是协议的正确选择 - 但我正在努力在网上找到任何替代建议。

如何以相当快的方式将非常大的项目集合序列化到 blob 存储,而不会遇到内存问题?

0 投票
1 回答
2331 浏览

c++ - 如何将字节 [] 放入 capnp::Data

在官方网站上,有一个很好且相对全面的示例,说明如何使用 CapnProto 进行 C++ 序列化。缺少的是如何处理第二个 Blob 类型capnp::Data,仅在其中capnp::Text介绍。

为了完整起见,以下是模式语言对 blob 类型的说明:

Blob:文本、数据

...

  • 文本始终采用 UTF-8 编码并以 NUL 结尾。

  • 数据是完全任意的字节序列。

所以,如果我有以下架构

我可以像这样开始构建我的信息

在这一点上,我被卡住了。我不能这样做:

所以我稍微搞砸了,看到 capnp::Data 正在包装kj::ArrayPtr<const byte>,但我无法以某种方式获得一个ArrayPtr,更不用说使用它来为我的消息设置 Payload 字段了。

我看到有一种方法可以设置类型的默认值Data(即payload @5 :Data = 0x"a1 40 33";),但是在这种情况下,模式语言并没有真正转换为 C++,所以这对我也没有帮助。

如果有人能指出我在这里缺少的东西,我将不胜感激。另外,如果我在我的架构中拥有List(Data)而不是作为有效负载,我将如何做到这一点?Data

0 投票
1 回答
494 浏览

protocol-buffers - 是否有任何 Thrift 风格的 RPC 系统允许回调?

在使用了几种不同的消息传递和 RPC 系统后,我得出的结论是,您最终总是需要传统的 RPC,推送某种类型的事件。否则,您不可避免地会遇到一些投票黑客。

例如,HTTP 最初只支持 RPC 样式的方法(GET 和 POST 立即返回响应)。人们意识到需要推送事件,因此使用长轮询来破解它。最终,通过Server-Sent Events解决了这个问题。

CoAP(基于 UDP 的轻量级 HTTP 版本)还通过向 GET 请求添加“监视器”选项来支持推送事件。这是一个非常优雅的解决方案。

但是这些都不是 Thrift 风格的 RPC,我的意思是你编写一个接口定义文件,并且有一些工具可以将该接口编译为你选择的语言的本机代码。此后,您几乎可以像调用本地程序一样调用远程程序。

所以我的问题是,是否有任何 Thrift 风格的 RPC 系统可以让您订阅推送事件并在事件到达时调用回调(或类似的)?

0 投票
2 回答
520 浏览

c++ - 无法通过 ZMQ 发送 capnp 消息

我有以下代码,我正在尝试通过 ZMQ 发送一条 capnp 消息:

我正在使用发布-订阅模式,我收到以下错误:

0 投票
1 回答
687 浏览

c++ - Cap'n Proto CMake 支持:未找到 CAPNP_LIB_CAPNP-JSON

为什么我必须设置

set(CAPNP_LIB_CAPNP-JSON "")

在我的 CMakeLists.txt 中为了不出错?错误如下:

我使用 capnproto CMake 支持的方式是将capnproto 源中包含的 cmake 文件复制到我的项目中并手动包含它。(有没有更好/标准的方法来做到这一点?感觉很hackish。)其余的只是取自CMake文件的说明。

CMake 片段:

CMake 3.6.2,使用 CLion 的集成构建命令进行构建。capnp 是通过自制软件安装的,最新版本。

为什么我收到有关 JSON 位的错误?那是关于什么的?

另外,有没有更好的方法来包含官方 Cap'n Proto CMake 文件?通过自制软件安装时,它似乎没有随头文件和库文件一起分发。

0 投票
1 回答
1151 浏览

c++ - 在 Cap'n Proto 中读取和写入字节数组的正确语法?

假设我有一个数组:

我在模式中有这样的:

读取和写入此字段的正确方法是什么?看起来我应该能够在数组周围包装一个capnp::Data::Reader并使用构建器的 setValue(),但语法确实不明显。

另一条路也有些神秘。反序列化时如何填充数组?我目前的方法涉及 memcpy,但我认为有一种 Cap'n Proto 方法可以做到这一点。

0 投票
1 回答
1926 浏览

ipc - 有没有像 DBus 那样具有信号功能的 RPC 框架?

我们目前正在寻找RPC框架,但遗憾的是找不到任何具有信号功能的框架,但我们需要它。我们查看了gRPC, Apache ThriftCap-n-Proto发现它们中没有一个像 DBus 那样提供开箱即用的功能。值得一提的是,我们需要它作为 IPC。此外,我们还需要监控 1 个套接字,一个用于 RPC 服务器,另一个用于另一个服务器。我们DBus可以将它添加到 glib 的主循环中。我们的目标 RPC 必须允许这样做。

PSDBus并不是我们真正需要的,因为我们只需要客户端-服务器架构而不是客户端-总线-守护进程。

PPS 关于off-topic- 我在这个问题中看不到任何需要固执己见的答案。答案应该包含事实,而不是观点。

0 投票
1 回答
411 浏览

c++ - Cap'n Proto 和 Promise 流水线

我想尝试使用 Cap'n Proto C++ RPC 进行承诺流水线,但我不知道该怎么做。

这是我的架构:

这是我想做的(伪代码):

我试图做这样的事情:

但这不是使用承诺的好方法。我希望你明白我想做什么。

谢谢你。

编辑:另一个问题:如何在服务器上实现这些方法?

我写了这段代码:

但我不知道如何实现 getInt() 和 increment()。

0 投票
1 回答
695 浏览

c++ - 如何在 capnproto C++ 生成的代码中设置列表的字符串项?

我有这样的 capnproto 定义:

我想使用类似于此的代码在构建器中设置 emailAddresses 字段(但这不会编译):

这样做的正确方法是什么?

0 投票
1 回答
1703 浏览

python - 错误:pip install pycapnp

我一直在尝试在我的 macbook pro 上通过 pip 安装 pycapnp。但我似乎在尝试下载它时遇到了问题。

以下是错误:

任何帮助将不胜感激。谢谢!