技术文章和通讯

选择MATLAB应用程序部署策略

MathWorks的提图斯·埃德尔霍夫博士(Titus Edelhofer)著


对于部署和共享用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函数或脚本。例如,可以使用下面的语句来启动命名为黑色斯基尔姆位于MATLAB搜索路径中的一个目录中:

matlab - r”blackscholes;退出”

黑色斯基尔姆脚本执行完成批处理所需的任何步骤,例如从文件或数据库读取参数或数据、计算结果,并将结果保存到另一个文件或数据库。

在实践中,使用更高级命令来处理错误并抑制不必要的可视元素:

matlab -nodesktop -nosplash -wait -r“尝试,黑暗;抓住,结束;戒烟”

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

使用MATLAB并行服务器

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

典型的工作流程如下:从Parallel Computing Toolbox™开始,使用议案或者工作和任务。一旦代码按预期并行运行(不考虑性能因素),准备代码在MATLAB并行服务器集群上运行时,您不需要对代码进行任何更改;这仅仅是使用另一种配置的问题。

生成C / c++代码

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

这种方法的主要缺点是Matlab编码器支持核心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文件的文件的数据交换机制。

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

创建共享库

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

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

为应用程序服务器创建Java组件

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

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

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

为应用程序服务器创建。net程序集

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

网页部署

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

MATLAB生产服务器

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

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

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

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

MATLAB生产服务器和Microsoft SQL Server

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

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

对于此设置,当行添加到表中时,仅填充包含必要数据的列。其他列由MATLAB的后端填充。

选择正确的战略

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

关于作者

提图斯博士Edelhofer是MathWorks咨询服务的高级团队领导者。他与财务,能源贸易和生产的公司合作,以及各种应用程序的汽车行业,以自动化业务流程,减少开发时间,并将Matlab解决方案集成到业务关键型应用程序中。金宝搏官方网站巨列持有M.S.和博士。在德国亚琛技术大学的数学中。

发布于2014 - 92230v00

查看相关功能的文章