В зависимости от того, как ваши данные помещаются в памяти, выберите один из следующих методов:
Если ваши данные в данный момент находятся в памяти локальной машины, можно использовать 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?
Для получения дополнительной информации о рабочих процессах для больших данных смотрите Выбор решения для параллельных вычислений.
Если ваши данные помещаются в памяти локальной машины, можно использовать распределенные массивы для разделения данных между работниками. Используйте distributed функция для создания распределенного массива в клиенте MATLAB и хранения его данных на рабочих местах открытого параллельного пула. Распределенный массив распределяется в одной размерности и максимально равномерно по этой размерности среди работников. Вы не можете управлять деталями распределения при создании распределенного массива.
Вы можете создать распределенный массив несколькими способами:
Используйте distributed функция для распределения существующего массива из клиентской рабочей области среди работников параллельного пула.
Используйте любой из distributed функций, чтобы непосредственно создать распределенный массив для рабочих процессов. Этот метод не требует, чтобы массив уже существовал в клиенте, тем самым уменьшая требования к памяти рабочей области клиента. Функции включают и eye(___, 'distributed'). Полный список см. в разделе rand(___, 'distributed')distributed страница с описанием объекта.
Создайте кодовый распределенный массив внутри 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 оператор или внутри связывающегося задания. При создании codistributed массив, можно управлять всеми аспектами распределения, включая размерности и разделы.
Связь между распределенным и кодовым распределением массивов является одной из перспективных. Распределенные по коду массивы разделяются между работниками, из которых вы выполняете код, чтобы создать или манипулировать ими. Когда вы создаете распределенный массив в клиенте, вы можете получить доступ к нему как к кодовому распределенному массиву внутри spmd оператор. Когда вы создаете codistributed array в spmd оператор, вы можете получить доступ к нему как к распределенному массиву в клиенте. Только spmd операторы позволяют вам получить доступ к одним и тем же данным массива с двух разных точек зрения.
Можно создать codistributed массив несколькими способами:
Используйте codistributed функция внутри spmd оператор или задание передачи для кодового распространения данных, уже существующих на работниках, выполняющих это задание.
Используйте любую из кодовых функций, чтобы непосредственно создать кодовый массив на рабочих местах. Этот метод не требует, чтобы массив уже существовал в рабочих местах. Функции включают и eye(___, 'codistributed'). Полный список см. в разделе rand(___, 'codistributed')codistributed страница с описанием объекта.
Создайте распределенный массив вне spmd оператор, затем доступ к нему как к кодовому распределенному массиву внутри spmd оператор, выполняемый в том же параллельном пуле.
Создайте кодовый распределенный массив внутри spmd оператор с использованием схемы распределения без ограничений. Сначала задайте распределение 1-D вдоль третьей размерности с 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 arrays, смотрите Работа с Codistributed Arrays.
codistributed | datastore | distributed | eye | rand | repmat | spmd | tall