В зависимости от того, как ваши данные помещаются в памяти, выберите один из следующих методов:
Если ваши данные в данный момент находятся в памяти локальной машины, можно использовать 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