在并行池上使用 tall 数组
如果您有 Parallel Computing Toolbox™,则可以在本地 MATLAB® 会话中或本地并行池中使用 tall 数组。如果您安装了 MATLAB Parallel Server™,您还可以在集群上运行 tall 数组计算。此示例使用您计算机上的本地集群中的工作单元。您可以在本地开发代码,然后扩大规模,以利用 Parallel Computing Toolbox 和 MATLAB Parallel Server 提供的功能,而无需重写算法。另请参阅使用 tall 数组和数据存储的大数据工作流。
创建一个数据存储并将其转换为 tall 表。
ds = datastore('airlinesmall.csv'); varnames = {'ArrDelay', 'DepDelay'}; ds.SelectedVariableNames = varnames; ds.TreatAsMissing = 'NA';
如果您安装了 Parallel Computing Toolbox,当您使用 tall
函数时,MATLAB 会自动启动一个并行工作单元池,除非您关闭默认并行池首选项。默认集群使用您计算机上的本地工作单元。
如果您有 Parallel Computing Toolbox,您可以运行与 MATLAB tall 表示例相同的代码,并在本地计算机的工作单元上并行执行它。
从数据存储中创建一个 tall 表 tt
。
tt = tall(ds)
Starting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers. tt = M×2 tall table ArrDelay DepDelay ________ ________ 8 12 8 1 21 20 13 12 4 -1 59 63 3 -2 11 -1 : : : :
显示内容表明行数 M
尚不清楚。M
是一个占位符,直到计算完成。
从 tall 表中提取到达延迟 ArrDelay
。此操作将创建一个新的 tall 数组变量以供后续计算使用。
a = tt.ArrDelay;
您可以对 tall 数组指定一系列操作,这些操作直到调用 gather
才会执行。这样做可以让您批处理可能需要很长时间的命令。例如,计算到达延迟的平均值和标准差。使用这些值来构建平均值 1 个标准差以内的延迟的上限和下限阈值。
m = mean(a,'omitnan'); s = std(a,'omitnan'); one_sigma_bounds = [m-s m m+s];
使用 gather
计算 one_sigma_bounds
,并将答案记入内存。
sig1 = gather(one_sigma_bounds)
Evaluating tall expression using the Parallel Pool 'Processes': - Pass 1 of 1: Completed in 4.5 sec Evaluation completed in 6.3 sec sig1 = -23.4572 7.1201 37.6975
如果您想同时评估几件事,您可以为 gather
指定多个输入和输出。这样做比在每个 tall 数组上单独调用 gather
要快。作为示例,计算最小和最大到达延迟。
[max_delay, min_delay] = gather(max(a),min(a))
max_delay = 1014 min_delay = -64
如果您想要串行开发并且不使用本地工作单元或指定的集群,请输入以下命令。
mapreducer(0);
mapreducer
更改执行环境,则该 tall 数组无效,必须重新创建它。要再次使用本地工作单元或指定的集群,请输入以下命令。mapreducer(gcp);
注意
使用 tall 数组开发算法的好处之一是您只需编写一次代码。您可以在本地开发代码,然后使用 mapreducer
扩展到集群,而无需重写算法。有关示例,请参阅 在 Spark 集群上使用 tall 数组。
另请参阅
gather
| tall
| datastore
| table
| mapreducer
| parpool