MATLAB与Java混合编程:并行任务提交实现

项目地址:https://github.com/CHanzyLazer/Matlab-JavaThreadPool

问题描述

最近做课题越来越接触到一些重复的任务需要并行执行可以大大提高效率,例如机器学习需要的训练数据,或者绘制一条曲线上需要很多个点,每个点都是独立的数据,甚至是重复计算一个结果来验证正确性等等。并且现在也需要更多的使用超算,原本手动管理任务的提交效率也很低,因此就在尝试使用软件来自动并行提交任务。

首先在我的使用习惯中,主导的软件一般是 Matlab,因为 Matlab 拥有比较完整的库,可以在一个软件中完成任务的提交,文本读取获得数据,数据处理,以及数据的绘制(另一个替代品是则是 Python,不过在我看来只能处于替代品的位置)。在之前我一般会借助 Parallel Computing Toolbox,使用 parfor 和 system() 来并行提交任务,但是这会遇到一些问题:

  • Matlab 的线程池有两种模式,在 Process 模式中,每个线程都会创建一个相对独立的 Matlab 进程(每个会占用大概 500MB 的内存),线程池初始化慢不说,当线程数多了后占用的内存也是非常的高。
  • 在 Thread 模式中,无法设置超过 cpu 核心数目的线程数,会浪费掉一半的超线程不说,如果是向超算提交远程任务这个限制也非常不合理。并且 Thread 模式会有很多限制,比如目前的 Matlab 版本中(R2022b),不能设置 parfor 的最大并行数目,因此这个模式在这里还是基本不可用的状态。
  • 不能创建多个线程池,不能异步编程等等。

因为我最近有做一些 Java 的并行编程,因此这些也都是相比 Java 的到的一些缺点(毕竟Python的并行甚至会内存泄漏),好在我在搜索 Matlab 相关部分的时候,发现了 Matlab 对 Java 的混合编程支持程度非常好,因此萌生了在 Matlab 中直接使用 Java 的线程池的想法。

原理介绍

具体可以参考官方对于 Matlab 和 Java 混合编程的文档:https://ww2.mathworks.cn/help/matlab/java-language.html?s_tid=CRUX_lftnav

(或者直接问ChatGPT)

首先这里选用的是 Java 中的 FixedThreadPool 来获取固定并行数目的线程池,不过还需要实时检测线程池中任务的数目来实现进度条,或者等待线程池完成等操作,因此实际使用的是和 FixedThreadPool 相同参数设置的 ThreadPoolExecutor。

为了保持代码简洁,这个线程池只需要负责并行执行系统的指令(具体使用类似 Matlab 的 system 函数,但是并行执行),因此需要额外提供一个 SystemTask,继承 Runnable,在执行 run() 的时候使用 Runtime.exec() 来执行具体的系统指令,而线程池只需要根据输入的指令(String)来创建对应的 SystemTask 并加入内部的线程池中。

具体的使用细节和例子可以在 github 项目中查看:https://github.com/CHanzyLazer/Matlab-JavaThreadPool

下载

从 github 项目中下载:https://github.com/CHanzyLazer/Matlab-JavaThreadPool

或者直接下载:https://github.com/CHanzyLazer/Matlab-JavaThreadPool/releases/download/v1.0/Matlab-JavaThreadPool.zip

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空