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

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

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

  • Если ваши данные находятся в настоящее время в памяти о вашей локальной машине, можно использовать функцию 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(___,'distributed') и rand(___,'distributed'). Для полного списка смотрите страницу ссылки на объект 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.

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

| | | | | | |

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

Больше о