主要内容

将数组分发给并行工作者

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

根据您的数据在内存中的适合程度,选择以下方法之一:

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

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

  • 如果您的数据不适合您的集群的内存,您可以使用数据存储数组以块的形式划分和处理数据。另请参阅使用高阵列和数据存储的大数据工作流

并行加载分布式阵列数据存储

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

此示例展示如何使用创建和加载分布式数组数据存储.使用航空公司航班数据的表格文件创建数据存储。此数据集太小,无法显示在工作者上的数据的相等分区。要模拟大型数据集,可以使用人工增加数据存储的大小repmat

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

选择示例变量。

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

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

Dt =分布(ds);
使用'Processes'配置文件启动并行池(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

最后,检查每个worker加载了多少数据。

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

注意,数据是在工作线程上平均分区的。如欲了解更多有关数据存储,请参阅什么是数据存储?

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

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

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

您可以通过以下几种方式创建分布式数组:

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

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

  • 对象中创建共分布数组spmd语句,然后将其作为分布式数组访问spmd声明。这种技术允许您使用缺省情况以外的分发方案。

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

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

parpool (“过程”, 2)%创建池W = ones(6,6);W =分布(W);分发给工人spmdT = w *2;%对工人进行并行计算。% T和W都是共分布数组。结束T在客户端查看结果。% T和W都是分布数组。删除(gcp)%停止池

或者,您可以使用codistributed函数,它允许您控制维度和分区等更多选项,但通常更复杂。您可以创建codistributed数组中,可以在工作者本身上执行spmd语句或通信作业内部。当创建codistributed数组,您可以控制分布的所有方面,包括维度和分区。

分布式和共分布式数组之间的关系是一种透视关系。共分布数组在工作者之间进行分区,从中执行代码以创建或操作它们。在客户端中创建分布式数组时,可以将其作为共分布式数组访问spmd声明。创建共分布数组时spmd语句时,您可以在客户端中将其作为分布式数组访问。只有spmd语句允许您从两个不同的透视图访问相同的数组数据。

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

  • 使用codistributed函数在spmd语句或通信作业,以共同分发运行该作业的作业上已经存在的数据。

  • 使用任何共分布函数都可以直接在worker上构造一个共分布数组。该技术不要求数组已经存在于worker中。功能包括眼睛(___ codistributed)而且兰德(___ codistributed).有关完整列表,请参见codistributed对象引用页。

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

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

parpool (“过程”, 2)%创建池spmdCodist = codistributor1d(3,[4,12]);Z = 0 (3,3,16,codist);Z = Z + spmdIndex;结束Z在客户端查看结果。% Z是一个分布式数组。删除(gcp)%停止池

有关共分布数组的详细信息,请参见使用共分布数组

另请参阅

|||||||

相关的例子

更多关于

Baidu
map