主要内容

并行分区数据存储

并行地划分数据存储,将数据存储的一部分放在并行池中的每个worker上,在许多情况下可以提供好处:

  • 仅在整个数据存储的一部分或同时执行一些操作。

  • 搜索数据存储中的特定值,所有工作人员同时在自己的分区上操作。

  • 对跨所有分区的工人执行减少计算。

这个例子展示了如何使用分区并行地从数据存储中读取数据。它使用MATLAB中提供的航空公司数据的小型数据存储®,并从其中找到非纳米值的平均值'arrdelay'列。

计算平均值的一个简单方法是用所有非nan值的总和除以非nan值的数量。下面的代码首先以非并行的方式为数据存储执行此操作。首先,定义一个函数来累积计数和和。如果您想运行此示例,请将此函数复制并保存在MATLAB命令搜索路径上的一个文件夹中。

功能[total,count] = sumandcountar竞争延迟(ds)数= 0;尽管Hasdata (ds) data = read(ds);Total = Total + sum(数据。ArrDelay 1“OmitNaN”);count = count + sum(〜isnan(data.arrdelay));结束结束

以下代码创建数据存储,调用函数,并计算没有任何并行执行的均值。的抽搐toc函数用于计时执行,在这里和后面的并行案例中。

ds =数据存储(repmat ({“airlinesmall.csv”1)}, 20日,“TreatAsMissing”'na');ds。SelectedVariableNames ='arrdelay';重置(ds);tic [total,count] = sumandcountarvaldelay (ds) sumtime = toc mean = total/count
Total = 17211680 count = 2417320 sumtime = 7.7905 mean = 7.1201

分区函数允许您将数据存储区分为较小的部分,每个部分都表示为数据存储本身。这些较小的数据存储彼此完全独立工作,以便您可以在并行语言功能内与它们一起工作parfor循环和spmd块。

的分区数设置了以下代码中的分区数numpartitions函数,基于数据存储本身(ds)和平行池(gcp)的大小。这并不一定等于池中的工人数量。在本例中,循环迭代的次数随后被设置为分区的数量(N).

以下代码在本地群集上启动并行池,然后在工人之间分区数据存储区以迭代循环。同样,调用单独的函数,包括parfor循环使计数和总计汇编。如果要运行该示例,请复制并保存此函数。

功能[total, count] = parforsumandcountarvaldelay (ds) N = numpartitions(ds,gcp); / /指定分区总= 0;数= 0;parfor2 = 1: N%获取数据存储的ii分区。再分=分区(N, ds ii);[localTotal, localCount] = sumAndCountArrivalDelay(再分);total = total + localTotal;count = count + localCount;结束结束

现在MATLAB代码调用这个新函数,以便非nan值的计数和求和可以在并行循环迭代中发生。

p = parpool (“本地”4);重置(ds);tic [total,count] = parforsumandcountarvaldelay (ds) parfortime = toc mean = total/count
使用“local”配置文件启动并行池(parpool)…connect to the parallel pool (number of workers: 4). total = 17211680 count = 2417320 parfortime = 6.4133 mean = 7.1201

您不需要让软件计算分区的数量,而是可以显式地设置这个值,这样就可以适当地对数据进行分区,以适合您的算法。例如,从spmd块,您可以指定工人的数量(numlabs.)作为要使用的分区数量。下面的函数使用spmd块执行并行读取,并显式设置等于工人数量的分区数。要运行此示例,请复制并保存函数。

功能[总,计数] = spmdsumandcountarivaldelay(DS)spmdsubds = partition(ds,numlabs,labindex);[总,计数] = SumandCountArivaldelay(Subds);结束总=(({}):总)总和;数=总和(({}):数);结束

现在Matlab代码调用使用使用的函数spmd块。

重置(ds);tic [total,count] = spmdsumandcountarvaldelay (ds) spmdtime = toc mean = total/count
Total = 17211680 count = 2417320 spmdtime = 4.6729 mean = 7.1201
删除(p);
使用“本地”配置文件的并行池正在关闭。

通过比较变量中记录的时间,您可能会了解到适度的性能改进sumtimeparfortime, 和spmdtime.您的结果可能会有所不同,因为性能可能会受到数据存储大小、并行池大小、硬件配置和其他因素的影响。