主要内容

将数组分配给并行工作器

使用分布式数组跨工作人员分区数据

根据数据在内存中的大小,选择以下方法之一:

  • 如果数据当前在本地计算机的内存中,则可以使用分布式函数将现有数组从客户端工作区分发到并行池的工作人员。这个选项可以用于测试或在执行显著增加数组大小的操作之前使用,例如repmat

  • 如果您的数据不适合本地机器的内存,但适合集群的内存,您可以使用数据存储分布式函数将数据读入并行池的工作程序的内存。

  • 如果您的数据不能放入集群的内存中,您可以使用数据存储数组以分区和处理数据块。另请参阅使用高数组和数据存储的大数据工作流

并行使用负载分布式阵列数据存储

如果您的数据不适合本地机器的内存,但适合集群的内存,您可以使用数据存储分布式函数创建分布式数组并在工作人员之间分区数据。

这个例子展示了如何使用数据存储.使用航空公司航班数据的表格文件创建数据存储。该数据集太小,无法显示在工作人员上对数据的平均分区。要模拟大型数据集,可以使用repmat

文件= repmat ({“airlinesmall.csv”} 10 1);ds = tabularTextDatastore(文件);

选择示例变量。

ds。SelectedVariableNames = {“DepTime”“DepDelay”};ds。TreatAsMissing =“NA”

通过并行读取数据存储来创建分布式表。为数据存储分区,每个工作人员有一个分区。然后,每个worker从对应的分区读取所有数据。文件必须位于工作人员可以访问的共享位置。

dt =分布式(ds);
使用“local”配置文件启动并行池(parpool)…连接到4个工人。

显示关于分布式表的摘要信息。

总结(dt)
变量:DepTime: 1,235,230×1 double值:min 1 max 2505 NaNs 23,510 DepDelay: 1,235,230×1 double值:min -1036 max 1438 NaNs 23,510

确定高桌子的大小。

大小(dt)
Ans = 1235230

的前几行dt

头(dt)
ans = DepTime DepDelay _______ ________ 642 12 1021 1 2055 20 1332 12 629 -1 1446 63 928 -2 859 -1 1833 3 1041 1

最后,检查每个工作人员加载了多少数据。

spmd, dt,结束
实验1:这个工人存储dt2(1:370569,:)。LocalPart: [370569×2 table] Codistributor: [1×1 codistributor1d] Lab 2:这个worker存储dt2(370570:617615,:)。LocalPart: [247046×2 table] Codistributor: [1×1 codistributor1d] Lab 3:这个worker存储dt2(617616:988184,:)。LocalPart: [370569×2 table] Codistributor: [1×1 codistributor1d] Lab 4:这个worker存储dt2(988185:1235230,:)。Codistributor: [1×1 codistributor1d]

请注意,数据是在工作人员之间平均划分的。有关数据存储,请参阅什么是数据存储?

有关大数据工作流的详细信息,请参见选择一个并行计算解决方案

创建分布式和协分布式数组的替代方法

如果数据适合放在本地机器的内存中,可以使用分布式数组在工作人员之间分区数据。使用分布式函数在MATLAB客户端中创建一个分布式数组,并将其数据存储在开放并行池的工作人员上。分布式阵列是在一维中分布的,并且在工作人员中尽可能均匀地分布在一维中。创建分布式阵列时,无法控制分布式的详细信息。

创建分布式数组有以下几种方法:

  • 使用分布式函数将现有数组从客户端工作区分发到并行池的工作人员。

  • 使用任何分布式函数直接在工人上构造一个分布式数组。这种技术不需要客户端中已经存在数组,从而减少了客户端工作空间的内存需求。功能包括眼睛(___“分布式”)兰德(___“分布式”).有关完整列表,请参见分布式对象引用页面。

  • 对象中创建一个协分布数组spmd语句,然后将其作为分布式数组访问spmd声明。这种技术允许您使用除默认方案之外的其他分布方案。

前两种技术不涉及spmd在创建数组时,但您可以使用spmd操作以这种方式创建的数组。例如:

在客户端工作区中创建一个数组,然后使它成为一个分布式数组。

parpool (“本地”, 2)%创建池W = 1 (6,6);W =分布式(W);分配给工人spmdT = W * 2;在工人上并行执行的计算。% T和W在这里都是协分布数组。结束T%在客户端查看结果。% T和W都是分布数组。删除(gcp)%停止池

或者,您可以使用codistributed函数,它允许您控制更多选项,如尺寸和分区,但通常更复杂。您可以创建codistributed数组通过在工人本身上执行spmd声明或在沟通工作中。当创建一个codistributed数组,可以控制分布的所有方面,包括维度和分区。

分布式阵列和协分布式阵列之间的关系是一种透视关系。协同分布数组被划分到执行代码以创建或操作它们的工作人员之间。当您在客户端中创建分布式数组时,您可以在spmd声明。类中创建协分布数组时spmd语句,则可以在客户端中将其作为分布式数组进行访问。只有spmd语句允许您从两个不同的角度访问相同的数组数据。

您可以创建codistributed数组的几种方式:

  • 使用codistributed函数在一个spmd语句或通信作业,以协分发运行该作业的工作人员上已经存在的数据。

  • 使用任何协分布函数直接在工人上构造一个协分布数组。这种技术不需要工作人员中已经存在数组。功能包括眼睛(___ codistributed)兰德(___ codistributed).有关完整列表,请参见codistributed对象引用页面。

  • 对象外部创建分布式数组spmd语句,然后将其作为一个协分布数组访问spmd在同一并行池上运行的语句。

对象中创建一个协分布数组spmd语句使用非默认的分布方案。首先,定义沿第三维的一维分布,工人1上有4个部分,工人2上有12个部分。然后创建一个3 × 3 × 16的零数组。

parpool (“本地”, 2)%创建池spmdcodist = codistributor1d(3(4、12));Z = 0 (codist 3, 3, 16日);Z = Z + labindex;结束Z%在客户端查看结果。% Z是一个分布式数组。删除(gcp)%停止池

有关协作分布式数组的详细信息,请参见使用协同分布数组

另请参阅

|||||||

相关的例子

更多关于