技术文章及通讯

选择MATLAB应用程序部署策略

作者:Titus Edelhofer博士,MathWorks


对于部署和共享用MATLAB开发的应用程序,您有广泛的选项®.最直接的选择之一是将各个算法和应用程序打包到一个文件中,并将该文件分发给其他MATLAB用户。然而,在许多情况下,这种简单的方法并不实用。生产需求、IT环境或性能需求可能需要更高级的部署策略。

本文指导您完成为MATLAB应用程序选择最佳部署方法的过程。它涵盖了三种主要的可用策略:使用批处理直接部署MATLAB代码,使用MATLAB Coder™生成C代码,以及使用MATLAB Compiler™部署。

对部署策略的概述绝不是详尽的。没有放之四海而皆准的策略,在选择策略来满足需求之前,彻底分析需求是很重要的。

应用程序结构:前端和后端

在考虑部署策略之前,了解应用程序的结构以及它如何影响可用选项是很重要的。所有的MATLAB应用程序都由两个部分组成:前端和后端。的前端是终端用户与之交互的部分。它是界面或网页,通常由控制元素(包括用户可以输入数字或其他信息的按钮和框)和显示元素(包括表格和图形)组成。

后端是计算结果并生成要显示的图形的计算引擎。后端和前端结合起来管理您的部署选项。由于基于MATLAB的前端部署相当简单,因此本文将重点讨论后端部署的选项。

将本地MATLAB代码部署到其他MATLAB用户

部署未编译的MATLAB代码有两种基本策略:使用MATLAB作为批处理引擎,或使用MATLAB Parallel Server™。

MATLAB批处理

批处理方法的一个优点是易于实现—更新服务器代码是一项微不足道的任务。但是,它的可伸缩性有限,因此可能不适合处理多个并发请求。这种方法还需要MATLAB的并发网络许可,因为批处理不绑定到一个特定的用户。

在MATLAB批处理中,MATLAB不是作为交互环境使用的,而是作为执行单个命令的进程,或者对于更复杂的计算,作为包含一系列命令的脚本使用。调用MATLAB(通常是前端)的进程必须能够在同一台机器上启动外部程序(在本例中是MATLAB)。具体来说,调用进程使用“-r”命令行选项启动MATLAB。命令Matlab -r“语句”将启动MATLAB并执行指定的MATLAB声明,可以是MATLAB函数或脚本。例如,下面的语句可用于开始批处理一个名为blackscholes.m位于MATLAB搜索路径中的目录:

Matlab -r " blackscholes;退出"

blackscholes.m脚本执行完成批处理所需的任何步骤,例如从文件或数据库读取参数或数据、计算结果以及将结果保存到另一个文件或数据库。

在实践中,更高级的命令用于处理错误和抑制不必要的视觉元素:

Matlab -nodesktop -nosplash -wait -r " try,blackscholes;catch,end;quit "

当对外部可执行文件的简单调用就足以完成处理,并且高可用性不是严格要求时,批处理是合适的。请注意,当您打算将MATLAB也用于前端时,使用这种方法几乎没有什么好处,因为这将涉及使用另一个许可证启动MATLAB的第二个实例。

MATLAB并行服务器的实现

批处理简化了未编译的MATLAB代码在与前端相同的机器上的执行,而MATLAB并行服务器使得计算密集型的MATLAB代码很容易从桌面卸载到服务器环境。使用MATLAB并行服务器,您可以在计算机集群或Amazon EC2上运行计算密集型的MATLAB应用程序。这种方法支持需要并行计算和处金宝app理存储在分布式阵列中的大型数据集的应用程序。由于MATLAB并行服务器为MATLAB工具箱提供了许可证,您可以在集群上执行MATLAB应用程序,而无需为每台计算机获取特定于产品的许可证。

典型的工作流程如下:从并行计算工具箱™开始,准备用于并行执行的代码parfor或者工作和任务。一旦代码按预期并行运行(排除性能考虑),准备代码在MATLAB并行服务器集群上运行,您不需要进行任何代码更改;这仅仅是使用另一种配置的问题。

生成C/ c++代码

MATLAB Coder可以用来生成自包含的,可部署的C/ c++代码。生成的符合ANSI/ISO的C和c++代码不依赖于MathWorks提供的静态或动态库或运行时环境;它可以在任何提供合适C/ c++编译器的平台上使用。当目标部署平台不受matlab支持时,建议使用这种方法—这种平台包括嵌入式系统和平台,如AIX或IRIX。金宝app对于这些平台,您可以生成集成到较大应用程序或作为共享库调用的C/ c++代码。

这种方法的一个主要缺点是MATLAB Coder支持核心MATLAB语言特性的子集——包括程序控制结构、函数和矩阵操作金宝app——但不支持所有MATLAB和相关工具箱提供的功能。看到支持C/ c++代码生成的MATLAB语言特性金宝app

使用MATLAB编译器进行部署

MATLAB编译器使您能够将MATLAB程序部署为独立应用程序或共享库(。Lib或.dll文件)。使用MATLAB编译器创建的应用程序和库依赖于MATLAB运行时,它使用户能够在不安装MATLAB的情况下运行已编译的MATLAB应用程序。MATLAB运行时可以打包并随应用程序一起安装,也可以在安装过程中下载。因为您可以自由分发MATLAB运行时,MATLAB编译器使您能够运行代码的多个实例,而无需获得额外的许可。

由MATLAB编译器生成并由MATLAB运行时处理的代码是一种中间(加密)表示,类似于Java中的.class文件®这不是机器代码。MATLAB运行时使用与MATLAB处理标准MATLAB脚本和命令相同的引擎来解释这种中间表示。

可以使用MATLAB编译器将MATLAB代码部署为独立的Windows应用程序、共享库、Excel®插件、. net程序集或通用COM组件,以及其他选项(图1)。

图1。用于部署应用程序的MATLAB编译器选项。

创建独立应用程序

使用MATLAB编译器部署代码的最简单方法是生成一个独立的应用程序。可以生成具有内置接口(前端)的应用程序,也可以生成仅用作处理引擎的应用程序。作为处理引擎使用的独立应用程序类似于批处理中使用的未编译的MATLAB应用程序,因为它们由前端进程调用,该进程可以通过命令行传递参数。

这种方法的优点是,除了MATLAB编译器许可证之外,不需要额外的许可证—您可以分发应用程序并在没有安装MATLAB的系统上运行它。这种方法的一个限制是调试已编译的应用程序比调试MATLAB脚本更加困难。提供给MATLAB代码的输入参数必须作为字符串传递,这使得在前端和后端之间交换复杂的数据集变得困难。对于大型或结构化数据,最好使用基于XML、逗号分隔值(CSV)或MATLAB文件的基于文件的数据交换机制。

方法调用应用程序编译器,以启动编译过程应用程序tab在MATLAB中。编译器自动检测对其他MATLAB函数的依赖关系,并在编译过程中添加它们。您只需要添加编译器无法检测到的依赖项,例如数据文件或图像。请注意,只有MATLAB代码文件是加密的。

创建共享库

您还可以使用MATLAB编译器创建C或c++共享库(例如,.lib或.dll文件)。这支持一种进程内方法,在这种方法中,库和调用它的代码是单个操作系统进程的一部分。相比之下,前一节描述了涉及两个独立操作系统进程的进程外方法。要使用共享库方法,前端必须能够使用C包装器接口调用外部库。

在共享库中调用函数而不是调用独立可执行文件的优点是,传递参数要容易得多,特别是在数据集是结构化的或较大的情况下。使用MATLAB C API,可以将数据构造为矩阵、单元格数组或结构化数组以及其他数据类型。为了访问结果,调用应用程序从API提供的结构中提取本机C数据。

为应用服务器创建Java组件

当您将MATLAB程序部署为web应用程序或应用服务器组件时,授权用户可以通过web浏览器访问它。这种方法的一个主要优点是无需开发和维护客户端软件,也无需在每个用户的计算机上安装该软件。MATLAB编译器SDK™与MATLAB编译器一起创建可以部署到应用服务器和作为web应用程序的软件组件。

按照以下步骤将MATLAB应用程序部署到基于java的应用服务器:

  1. 使用MATLAB编译器SDK将MATLAB应用程序编译成Java ARchive (JAR)或Web应用程序ARchive (WAR)文件。MATLAB编译器SDK生成一个包装器Java类,用于调用编译后的代码。
  2. 在应用服务器上安装Java类和MATLAB运行时。

为应用服务器创建.NET程序集

微软对基于java的应用服务器的模拟是Internet信息服务(IIS),以前是Internet信息服务器。您可以使用MATLAB编译器SDK从MATLAB代码生成. net或COM组件,然后部署IIS以与ASP一起使用。网络应用程序。您生成的组件可以从任何符合公共语言规范的语言(如c#、VB)调用。NET和ASP。NET,以及任何能够访问COM组件的软件技术,包括Visual Basic®、ASP和Excel。

Web部署

Web部署的工作流类似于为Java和. net描述的应用程序服务器部署的工作流。使用MATLAB编译器SDK将MATLAB代码编译成Java或. net组件,然后由web服务器调用。使用“Web Figures”界面,无需安装任何客户端软件或插件,即可在Web页面上显示交互式图形。

MATLAB制作服务器

在应用服务器上运行编译过的MATLAB代码,只要并发请求数量保持较低,就可以可靠、快速地处理请求。然而,对于大量并发请求,对于运行编译过的MATLAB代码的应用服务器来说,性能可能成为一个问题。在RWE例如,开发人员使用MATLAB Compiler SDK和MATLAB Compiler构建了一个用于天然气自动定价和风险管理系统的Java组件。为了使系统能够处理许多并发请求,开发人员在应用服务器和编译的MATLAB代码之间添加了一层。在这一层中,冗余RMI服务器系统并发地为主应用程序服务器提供并行服务。然而,实现这样一个层并不是一项简单的任务。

要处理许多并发请求,而无需开发自己的中间件解决方案,可以使用MATLAB Production Server™。简单的管理,MATLAB生产服务器是既可伸缩的并发请求和快速(低延迟)。

可伸缩性是通过让多个MATLAB运行时实例(或“工作者”)运行并准备响应来自服务器的请求来实现的。为了增加可靠性和可伸缩性,可以组合多个MATLAB Production Server实例。worker在实例之间共享,以最大化性能并最小化响应时间。负载平衡负责访问不同的MATLAB Production Server实例(图2)。

图2。多个MATLAB生产服务器实例为具有负载均衡器的企业应用程序提供服务。

MATLAB生产服务器和Microsoft SQL Server

除了使用MATLAB Production Server作为企业应用程序的计算后端这一相对简单的情况外,还有一种特殊情况,即客户端系统是关系数据库——具体来说,是Microsoft®SQL Server®

在存储过程中,Microsoft SQL Server能够使用. net框架调用外部代码。在此过程中,数据库可以通过调用外部。net组件来填充表中的列。使用. net客户端API,这样的组件可以同步调用MATLAB Production Server来检索计算值(表的其他列可以用作计算的输入)。

对于这种设置,当向表中添加行时,只填充那些包含必要数据的列。其余列由基于MATLAB的后端填充。

选择正确的策略

正如本文开头所指出的,没有一种部署策略适合所有可能的场景。首先选择一个能满足你最高优先级需求的策略。然后,您可以开发一个更详细的解决方案,以满足您组织的所有需求。

作者简介

Titus Edelhofer博士他是MathWorks咨询服务公司的高级团队负责人。他与金融、能源交易和生产以及汽车行业的公司合作,在广泛的应用程序上实现业务流程自动化,减少开发时间,并将MATLAB解决方案集成到业务关键应用程序中。金宝搏官方网站Titus拥有德国亚琛工业大学数学硕士和博士学位。

发布日期:2014年9月22日

查看相关功能的文章