【问题标题】:What is the most efficient way to pass in memory data structure (tabular like) from C++ to Java?将内存数据结构(类似表格)从 C++ 传递到 Java 的最有效方法是什么?
【发布时间】:2021-11-01 03:21:30
【问题描述】:

就不在内存中处理数据而言,这仍然是最佳答案吗? (What is the most efficient(fastest) way of passing data from C++ to Java?)

我在考虑 Apache Arrow,我看到了两个选项:

  1. 在 C++ 中构建 Apache Arrow 数据结构,将其“序列化”为字节,通过 JNI 将字节传递给 Java 类(AFAIK 需要在 C++ 进程内存和 JVM 堆之间处理数据)。
  2. 使用 Apache Arrow Plasma,但需要运行 Plasma 服务器 AFAIU。

我错过了什么吗?

【问题讨论】:

  • 以什么方式高效?编码时间?维护?内存使用?性能?
  • 内存使用,我想在 C 中创建数据结构并将其传递给 Java,而不是将其复制到另一个类似 jvm 的对象。
  • 如果您没有使用像 Arrow Plasma 这样的中间人,您打算如何将数据从一个可执行文件转发到另一个可执行文件?如果他们在同一个系统上,我猜你可以使用 staging 文件夹传递 JSON 文件,这可能是最简单的机制。如果 java 正在运行一个 Web 界面,那会更容易。只需让 C 应用程序以已知格式将其扔到 Java 端点(同样,我会使用 JSON,但 XML 可以工作)。
  • 简单地使用来自 Java 的 Apache Arrow 的 C++ API 和 JavaCPP Presets for Arrow 可能是最有效的:github.com/bytedeco/javacpp-presets/tree/master/arrow

标签: java c++ apache-arrow


【解决方案1】:

您是否考虑过使用 Apache Arrow Flight?您可以在 C++ 中设置服务器并在 Java 端设置客户端吗? https://github.com/apache/arrow/tree/master/java/flight/flight-core/src/main/java/org/apache/arrow/flight/example

请注意,这仍处于试验阶段,API 可能会发生变化,因此尚未准备好投入生产。

【讨论】:

    【解决方案2】:

    Flight(如 @TDrabas 所述)是一个不错的选择,并且可能会以最少的工作提供出色的性能。

    另一种选择是将 Arrow IPC 格式的数据写入 C++ 中的内存映射文件,然后用 Java 将其读回。它可能会更快,因为您可以避免内存复制。

    work in progress 支持 C data interface,这可能是将来要考虑的事情。

    【讨论】:

    • 写入内存映射文件是指使用 MappedByteBuffer?
    • 是的,这也可能涉及您的数据副本。通常,您将在 C 中创建数据,然后使用 IPC 写入器将其写出到内存映射文件(这是一个副本,并且提前确切知道文件的大小也很棘手)。然后通过 JNI 或任何机制将文件的名称和大小传输到 Java。然后使用该信息创建一个 MappedByteBuffer。然后你使用 IPC 阅读器阅读。
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2020-11-02
    • 2010-09-09
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多