Распределительные массивы, чтобы быть параллельными рабочим

Используя распределенные массивы, чтобы разделить данные через рабочих

В зависимости от того, как ваши совпадения данных в памяти, выбирают один из следующих методов:

  • Если ваши данные находятся в настоящее время в памяти о вашей локальной машине, можно использовать distributed функция, чтобы распределить существующий массив от клиентской рабочей области до рабочих параллельного пула. Эта опция может быть полезна для тестирования или прежде, чем выполнить операции, которые значительно увеличивают размер ваших массивов, таких как repmat.

  • Если ваши данные не помещаются в память о вашей локальной машине, но действительно помещаются в память о вашем кластере, можно использовать datastore с distributed функционируйте, чтобы считать данные в память о рабочих параллельного пула.

  • Если ваши данные не помещаются в память о вашем кластере, можно использовать datastore с tall массивы, чтобы разделить и обработать ваши данные во фрагментах. См. также Рабочий процесс Больших данных с использованием высоких массивов и хранилищ данных.

Загрузите распределенные массивы в параллели Используя datastore

Если ваши данные не помещаются в память о вашей локальной машине, но действительно помещаются в память о вашем кластере, можно использовать datastore с distributed функция, чтобы создать распределенные массивы и разделить данные среди ваших рабочих.

В этом примере показано, как создать и загрузить распределенные массивы с помощью datastore. Создайте datastore с помощью табличного файла данных о полете. Этот набор данных слишком мал, чтобы показать равное разделение данных по рабочим. Чтобы симулировать большой набор данных, искусственно увеличьте размер datastore с помощью repmat.

files = repmat({'airlinesmall.csv'}, 10, 1);
ds = tabularTextDatastore(files);

Выберите переменные в качестве примера.

ds.SelectedVariableNames = {'DepTime','DepDelay'};
ds.TreatAsMissing = 'NA';

Составьте распределенную таблицу путем чтения datastore параллельно. Разделите datastore с одним разделом на рабочего. Каждый рабочий затем Считывает все данные от соответствующего раздела. Файлы должны быть в общем ресурсе, который доступен рабочими.

dt = distributed(ds);
Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers.

Отобразите итоговую информацию о распределенной таблице.

summary(dt) 
Variables:

    DepTime: 1,235,230×1 double
        Values:

            min          1
            max       2505
            NaNs    23,510

    DepDelay: 1,235,230×1 double
        Values:

            min      -1036
            max       1438
            NaNs    23,510

Определите размер длинной таблицы.

size(dt) 
ans =

     1235230           2

Возвратите первые несколько строк dt.

head(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, end
Lab 1: 
  
  This worker stores dt2(1:370569,:).
  
          LocalPart: [370569×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 2: 
  
  This worker stores dt2(370570:617615,:).
  
          LocalPart: [247046×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 3: 
  
  This worker stores dt2(617616:988184,:).
  
          LocalPart: [370569×2 table]
      Codistributor: [1×1 codistributor1d]
  
Lab 4: 
  
  This worker stores dt2(988185:1235230,:).
  
          LocalPart: [247046×2 table]
      Codistributor: [1×1 codistributor1d]

Обратите внимание на то, что данные разделены одинаково по рабочим. Для получения дополнительной информации о datastore, смотрите то, Что Datastore? MATLAB

Для получения дополнительной информации о рабочих процессах для больших данных, смотрите, Выбирают Parallel Computing Solution.

Альтернативные методы для создания распределенных и массивов Codistributed

Если ваши совпадения данных в памяти о вашей локальной машине, можно использовать распределенные массивы, чтобы разделить данные среди рабочих. Используйте distributed функция, чтобы создать распределенный массив в клиенте MATLAB и хранить его данные на рабочих открытого параллельного пула. Распределенный массив распределяется в одной размерности, и максимально равномерно по тому измерению среди рабочих. Вы не можете управлять деталями распределения при создании распределенного массива.

Можно создать распределенный массив несколькими способами:

  • Используйте distributed функция, чтобы распределить существующий массив от клиентской рабочей области до рабочих параллельного пула.

  • Используйте любой distributed функции, чтобы непосредственно создать распределенный массив на рабочих. Этот метод не требует, чтобы массив уже существовал в клиенте, таким образом, уменьшая клиентские требования к памяти рабочей области. Функции включают eye(___, 'распределенный') и rand(___, 'распределенный'). Для полного списка смотрите distributed страница ссылки на объект.

  • Создайте codistributed массив в spmd оператор, и затем получает доступ к нему как к распределенному массиву вне spmd оператор. Этот метод позволяет вам использовать схемы распределения кроме значения по умолчанию.

Первые два метода не включают spmd в создании массива, но можно использовать spmd управлять массивами создало этот путь. Например:

Создайте массив в клиентской рабочей области, и затем сделайте ее распределенным массивом.

parpool('local',2) % Create pool
W = ones(6,6);
W = distributed(W); % Distribute to the workers
spmd
    T = W*2; % Calculation performed on workers, in parallel.
             % T and W are both codistributed arrays here.
end
T            % View results in client.
whos         % T and W are both distributed arrays here.
delete(gcp)  % Stop pool

В качестве альтернативы можно использовать codistributed функция, которая позволяет вам управлять большим количеством опций, таких как размерности и разделы, но часто более сложна. Можно создать codistributed массив путем выполнения на самих рабочих, любая внутренняя часть spmd оператор, в pmode, или в связывающемся задании. При создании codistributed массив, можно управлять всеми аспектами распределения, включая размерности и разделы.

Отношение между распределенными и codistributed массивами является одной из перспективы. Массивы Codistributed разделены среди рабочих, от которых вы выполняете код, чтобы создать или управлять ими. Когда вы создаете распределенный массив в клиенте, можно получить доступ к нему как к codistributed массиву в spmd оператор. Когда вы создаете codistributed массив в spmd оператор, можно получить доступ к нему как к распределенному массиву в клиенте. Только spmd операторы позволяют вам получить доступ к тем же данным массива от двух других точек зрения.

Можно создать codistributed массив несколькими способами:

  • Используйте codistributed функционируйте в spmd оператор, связывающееся задание или pmode к codistribute данным, уже существующим на рабочих, запускающих то задание.

  • Используйте любую из функций codistributed, чтобы непосредственно создать codistributed массив на рабочих. Этот метод не требует, чтобы массив уже существовал в рабочих. Функции включают eye(___, 'codistributed') и rand(___, 'codistributed'). Для полного списка смотрите codistributed страница ссылки на объект.

  • Создайте распределенный массив вне spmd оператор, затем получите доступ к нему как к codistributed массиву в spmd оператор, работающий на том же параллельном пуле.

Создайте codistributed массив в spmd оператор с помощью схемы распределения не по умолчанию. Во-первых, задайте 1D распределение по третьему измерению с 4 частями на рабочем 1 и 12 частями на рабочем 2. Затем создайте 3 3 16 массивами нулей.

parpool('local',2) % Create pool
spmd
    codist = codistributor1d(3,[4,12]);
    Z = zeros(3,3,16,codist);
    Z = Z + labindex;
end
Z  % View results in client.
   % Z is a distributed array here.
delete(gcp) % Stop pool

Для получения дополнительной информации о codistributed массивах смотрите Работу с Массивами Codistributed.

Смотрите также

| | | | | | |

Связанные примеры

Больше о