В зависимости от того, как данные помещаются в память, выберите один из следующих методов:
Если данные в настоящее время находятся в памяти локального компьютера, можно использовать distributed функция для распределения существующего массива из клиентской рабочей области среди работников параллельного пула. Этот параметр может быть полезен для тестирования или перед выполнением операций, которые значительно увеличивают размер массивов, таких как repmat.
Если данные не помещаются в память локального компьютера, но помещаются в память кластера, можно использовать datastore с distributed функция для считывания данных в память работников параллельного пула.
Если данные не помещаются в память кластера, можно использовать datastore с tall массивы для секционирования и обработки данных по частям. См. также Рабочий процесс больших данных с использованием массивов и хранилищ данных.
datastoreЕсли данные не помещаются в память локального компьютера, но помещаются в память кластера, можно использовать datastore с distributed создание распределенных массивов и разбиение данных между работниками.
В этом примере показано, как создавать и загружать распределенные массивы с помощью datastore. Создайте хранилище данных с помощью табличного файла данных о рейсах авиакомпании. Этот набор данных слишком мал, чтобы показать равное разбиение данных на работников. Чтобы смоделировать большой набор данных, искусственно увеличьте размер хранилища данных с помощью repmat.
files = repmat({'airlinesmall.csv'}, 10, 1);
ds = tabularTextDatastore(files);
Выберите переменные примера.
ds.SelectedVariableNames = {'DepTime','DepDelay'};
ds.TreatAsMissing = 'NA';
Создание распределенной таблицы путем параллельного чтения хранилища данных. Разделите хранилище данных одним разделом на работника. Затем каждый работник считывает все данные из соответствующего раздела. Файлы должны находиться в общем расположении, доступном для работников.
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, смотрите раздел Что такое хранилище данных?
Дополнительные сведения о рабочих процессах для больших данных см. в разделе Выбор решения для параллельных вычислений.
Если данные помещаются в память локального компьютера, можно использовать распределенные массивы для разделения данных между работниками. Используйте 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 заявление. При создании совместно распределенного массива в spmd , вы можете получить доступ к нему как к распределенному массиву в клиенте. Только spmd операторы позволяют получать доступ к одним и тем же данным массива с двух разных точек зрения.
Можно создать codistributed массив несколькими способами:
Используйте codistributed функция внутри spmd оператор или передающее задание для codistribute данных, уже существующих на работниках, выполняющих это задание.
Используйте любую из coddistributed функций, чтобы непосредственно создать codistributed массив на рабочих. Этот метод не требует, чтобы массив уже существовал в рабочих элементах. Функции включают и 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 | datastore | distributed | eye | rand | repmat | spmd | tall