【问题标题】:Sending structs from c to java process将结构从 c 发送到 java 进程
【发布时间】:2016-03-29 08:19:54
【问题描述】:

我有一个 c 进程,需要将大量 c 结构(大约每秒 10,000 个)发送到需要将数据放入匹配类的 java 进程。

每个数据包需要发送的数据大小约为 50-100 字节。

延迟是一个问题,因为数据需要实时显示,这就是我正在寻找当前解决方案的替代方案的原因。

目前我正在使用 JNI 和 POSIX 消息队列来执行此操作。有没有比使用 JNI 和消息队列/管道更好的方法?我在某处读到调用 JNI 方法通常会产生很多开销。当必须发送大量数据时,这会成为问题吗?

我想到的另一个解决方案是将数据写入 UNIX 套接字并在 java 中解析。

【问题讨论】:

  • Java 和 C 中的代码是否需要在两个不同的进程中运行?
  • @SamuelAudet 是的,数据来自一个 IDS 插件,它必须尽可能快地处理网络数据包。处理完一个数据包后,我们将解码后的数据发送到另一个处理图形的进程。此外,c 进程作为服务运行,而 java 程序应根据需要独立启动或停止,而不影响正在运行的 c 程序。
  • 所以,我猜内存映射文件将是最有效的方法,这似乎是这种情况:stackoverflow.com/a/6412333/523744

标签: java c java-native-interface ipc


【解决方案1】:

我认为,这可以使用典型的 IPC 方法来解决。我会在消息队列和套接字上使用管道。消息队列的开销会减慢处理速度。管道比套接字快,但快不了多少。

对于您的问题,每个数据包 100 字节的 10,000 个结构达到 1 MB/s。现代多核处理器可以毫无问题地处理这个问题。

【讨论】:

    【解决方案2】:

    您可以通过避免不必要的内存复制来实现高吞吐量。通过direct byte buffers 在C 和Java 之间传输数据。从 Java 端,您可以读取字节缓冲区中的数据并将值复制到对象字段中。对于两个相互通信的进程,您可以使用内存映射文件来执行此操作(为此您可以使用MappedByteBuffer)。

    对于更简单但开销更大的事情,您可以简单地使用每个进程的标准输入/标准输出来以这种方式通信和发送数据。或者,正如您所建议的,套接字是另一种选择。

    对于 10,000 个结构,每个结构 100 字节,这将是 1 MB / 秒的数据处理速度。这在现代硬件上真的不应该是一个问题(对于我的一个项目,我在直接缓冲区和具有原始 + 数组字段的 Java 对象之间轻松管理超过 1GB / 秒,但这都是 JNI 和 Java 之间的一个过程)。

    您可能想先使用更简单的方法(stdin/stdout),并在深入研究使用内存映射文件之前先看看是否足够快。

    【讨论】:

    • 感谢您的意见。我会尝试将测试场景混合在一起,看看是否效果更好。
    【解决方案3】:

    如果您必须最终使用 Java 处理数据,则尽可能多地删除中间步骤。

    如果您可以将数据直接读入 Java(绕过 JNI 和 C 代码),那么就这样做。避免 JNI、消息队列和(大概)C 接收数据的阶段。队列也不能帮助延迟。

    如果数据以对 Java 不友好的 C 友好形式开始,那么我会考虑完全切换到 C 或 C++ 而不是在 Java 中处理。

    【讨论】:

    • 问题是信息来自的应用程序在 c 中,而 i(我的团队)只是扩展它。我们必须使用 java,因为除了 2 个人之外,没有人真正知道如何用 c/c++ 编程,所以我们选择了 java(6 人团队)。 c部分负责为入侵检测系统解码网络数据包。这必须尽可能快,并且在 c 中完成。然后我们将一些数据拆分到 java 程序中,该程序会根据数据构建图形以可视化网络。
    • 如果您的目标是构建图表以可视化结果,那么速度(即使是实时的)也不太可能成为主要问题。你真的遇到过任何真正的性能问题吗?您也可以用 C 语言构建图形并将最少的数据传递给 Java(图形结构,而不是单个数据项)。
    • @MarkG 我们必须使用 java,因为除了 2 个人之外,没有人真正知道如何用 c/c++ 编程,所以我们选择了 java(6 人团队)。不知道如何用 C/C++ 编程,你将很难编写 JNI,在那里你不仅要知道如何用 Java C 编写代码,而且你还要了解两种语言的工作原理。如果您已经在编写 JNI,那么您至少知道如何编写 C。
    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多