【问题标题】:Using MATLAB (Windows) generated Java package in Linux在 Linux 中使用 MATLAB (Windows) 生成的 Java 包
【发布时间】:2017-01-10 06:26:06
【问题描述】:

据我所知,我可以通过在 Linux 上安装 Matlab Runtime 在 Linux 上运行在 Windows 上生成的 .mex 文件(如果我错了,请纠正我)。但是,如果我想在 Linux(如 Ubuntu)上使用 MATLAB 生成的 java 包,它是在 Windows 上生成的,该怎么办?

目标:

我必须测试使用音频处理的功能。如果测试成功,我们将购买我们需要的产品。目前我在 Windows 上有我请求的许可证,由于请求的许可证有机器特定的限制,我可以在我的 Windows 机器上生成一些测试 java 代码,现在应用程序要部署在 android 上,所以我从谷歌了解到它需要运行 matlab 运行时或编译器才能使用转换/生成的代码。 Android 系统没有 MCR 或简单的 Matlab Runtime 安装支持,所以我转向了这个解决方案。

使用 linux 来托管从 android 获取一些输入的 servlet,以 json 或文本的形式处理返回答案。现在我的java包是使用Windows机器生成的,我迷路了。

据我所知,这种 code-convert-servlet-deploy-once 方法比 MATLAB Production Server 更具成本效益,因为我们必须为特定产品购买一次许可证。请记住,许可阶段是在我们测试这种方法是否能给我们带来预期的结果之后。

规格:

  • Windows 10

  • MATLAB 2016a(试用版)

  • MATLAB 产品(编译器/sdk、信号处理/音频处理工具箱)

  • 使用 JDK 1.7.x 制作的包(与 Windows 上的 MATLAB jdk/jre 版本完全匹配)

  • Ubuntu 16 Desktop(安装了 Oracle jdk 8_101,还安装了 MATLAB Runtime,我还可以使用 jdk 7.x(与 Windows 上生成软件包时使用的 MATLAB 相同))

问题:

  • 如何在Linux中创建java程序时使用这个java包?

  • 需要哪些软件+许可证才能实现?

  • 我应该在 Linux 机器上安装 MATLAB,在 Linux 机器上生成 Java 包并在同一台 Linux 机器上的 java 程序中使用该包吗? (我想我需要再次申请许可证)

  • 还有其他方法吗?我错过了什么吗?

【问题讨论】:

    标签: java linux matlab


    【解决方案1】:

    由 MATLAB Compiler SDK 生成的 Java 包通常是跨平台的 - 但是,它们可能会调用 mex 文件或其他特定于平台的库,如果它们这样做,则整个 Java 包将最终特定于平台。

    您并不完全清楚您是否调用mex 文件;并且您可能会在没有意识到的情况下调用特定于平台的库(例如,Signal Processing Toolbox 可能会调用某个库来执行某些操作)。

    此外,您对“能够在 Linux 上运行通过在 Linux 上安装 MATLAB 运行时生成的 mex 文件”的评论感到困惑 - mex 文件不是跨平台的,并且不要根本不用 MATLAB Runtime。

    因此,就平台而言 - 您可以在 Linux 上使用在 Windows 上生成的 Java 包,只要它不调用任何特定于 Windows 的 mex 文件或库。但是如果你在 Linux 上生成它,你可以排除这个问题,所以如果你使用相同的平台进行编译和执行会更容易。您应该很容易将 MATLAB 许可证重新分配给 Linux 机器来执行此操作。

    我错过了什么吗?

    是的:您提议的做事方式不太可能很好地扩展。如果您的 Linux 服务器上有一个 Java servlet 以及一个由 MATLAB Compiler SDK 生成的 Java 包,那么每当您调用 servlet 时,它都会调用 Java 包,这将启动 MATLAB Compiler Runtime (MCR ),运行您的 MATLAB 代码,将答案返回给 servlet,然后关闭 MCR。

    MCR 需要很长时间才能启动(几乎与 MATLAB 一样长)。因此,由于 MCR 启动时间,每次调用都会花费相当长的时间。

    因此,您可以通过创建某种实用工具来解决此问题,该工具将启动 MCR 并将其保留在那里,并传递请求并将答案返回给 servlet。

    但是您只有一个 MCR - 如果您同时收到多个请求会怎样?它们将排队(或丢弃)并且不会扩展。因此,您需要改进您的实用工具,以便它管理 MCR 池并将请求传递给一个空闲的池,并在执行过程中对它们进行负载平衡。

    但是,如果 MCR 崩溃或内存不足,会发生什么?实用工具将需要监控这种可能性,并重新启动任何崩溃的可能性。

    您还需要一些额外的东西来方便地管理所有这些东西。

    一旦你完成了所有这些(这将是困难的),你会意识到你现在已经编写了相当多的 MATLAB 生产服务器。我知道这很昂贵,但您可能想在采用您正在考虑的解决方案之前再看看它。

    【讨论】:

    • 让我们把 mex 的困惑放在一边,当我打包时,它会自动检测依赖文件,我假设它包含在 package.json 文件中。因此,如果我在 Linux 上有 MCR,我将能够在我的 java 应用程序中使用它们,比如 servlet?然后我将不得不编写 MATLAB PS,显然我不是。
    • 如果您在 Windows 上创建 MEX 文件,它们将是特定于 Windows 的。如果您随后在 Windows 上编译和打包 Java 组件,它将检测这些依赖项并将它们包含在打包的 Java 组件中。 Java 组件将是特定于 Windows 的。您将无法在 Linux 上运行它。
    猜你喜欢
    • 2015-04-24
    • 2015-12-20
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多