Длинные массивы являются мощным, интуитивным способом работать с большими наборами данных с помощью традиционного синтаксиса MATLAB®. Однако, поскольку длинные массивы работают с блоками данных, каждые из которых индивидуально помещаются в память, традиционные алгоритмы большинства функций должны быть обновлены, чтобы использовать параллелизированный подход, чтобы поддержать длинные массивы. Эта тема показывает вам, как разработать ваши собственные параллелизированные алгоритмы, чтобы работать с длинными массивами.
В настоящее время доступные подходы для применения пользовательских функций к длинным массивам:
Одноступенчатая Операция Преобразования: Примените функцию к блокам данных в длинном массиве.
Двухступенчатая Операция Сокращения: Примените функцию к длинному массиву, чтобы преобразовать содержимое, и затем применить другую функцию, чтобы сократить выход с одним блоком.
Операции скользящего окна: Примените функцию движущегося окна к длинному массиву, чтобы преобразовать содержимое.
Независимо от которой операции вы выбираете, существуют опции, факторы производительности и распространенные проблемы, которые применяются ко всем подходам.
Наиболее распространенные математические функции и операции MATLAB уже поддерживают длинные массивы. Если функциональность уже поддержана, то написание вашего собственного алгоритма не может быть необходимым.
Вот некоторые причины, почему вы можете хотеть реализовать пользовательский алгоритм для длинных массивов:
Реализация В настоящее время Неподдерживаемые Функции — Если конкретная функция в настоящее время не поддерживает длинные массивы, то можно использовать API, обрисованные в общих чертах здесь, чтобы записать версию этой функции, которая поддерживает длинные массивы.
Усильте Существующий Код — Если у вас есть существующий код, который выполняет некоторые операции на данных в оперативной памяти, затем только с незначительными модификациями, которыми можно сделать его совместимым, чтобы управлять на длинных массивах. Этот подход избегает потребности преобразовать код, чтобы соответствовать подмножеству языка MATLAB, который поддерживает длинные массивы.
Получите Производительность — Например, можно переписать функцию MATLAB как MEX-функцию C++, и затем можно использовать API, обрисованные в общих чертах здесь, чтобы вызвать MEX-функцию, чтобы работать с данными.
Пользуйтесь Предпочтительной Внешней Библиотекой — Для совместимости в вашей организации, это иногда требуется, чтобы пользоваться определенной внешней библиотекой для определенных вычислений. Можно использовать API, обрисованные в общих чертах здесь, чтобы повторно реализовать функцию с теми внешними библиотеками.
Поддерживаемые API предназначаются для усовершенствованного использования и не включают обширную входную проверку. Ожидайте проводить некоторое время, тестируя, что дополнительные функции, которые вы реализуете, удовлетворяют всем требованиям и выполняют вычисления, которые вы ожидаете. В настоящее время поддерживаемые API для авторской разработки алгоритмов длинного массива перечислены здесь.
Имя функции пакета | Описание |
---|---|
matlab.tall.transform | Примените заданную функцию к каждому блоку одного или нескольких длинных массивов. |
matlab.tall.reduce | Примените заданную функцию к каждому блоку одного или нескольких длинных массивов. Затем питайте выход этой функции во вторую функцию сокращения. |
matlab.tall.movingWindow | Применить функцию окна для блоков данных. |
matlab.tall.blockMovingWindow | Применить функцию окна и блочное сокращение к заполненным блокам данных. |
Когда вы создаете длинный массив из datastore, базовый datastore упрощает перемещение данных во время вычисления. Перемещения данных в дискретных частях вызвали блоки, где каждый блок является набором последовательных строк, которые могут уместиться в памяти. Например, одним блоком 2D массива (такого как таблица) является X(n:m,:)
. Размер каждого блока основан на значении ReadSize
свойство datastore, но блок состоит не всегда в том что точный размер. В целях разработки алгоритмов длинного массива длинный массив считается вертикальной конкатенацией многих таких блоков.
Блоки данного массива выбраны во времени выполнения на основе доступной памяти, таким образом, они могут быть динамическими. Поэтому блоки не могут быть точно тем же размером между запусками. Если у вас есть изменения на вашем компьютере, которые влияют на доступную память, то это может повлиять на размер блоков.
Несмотря на то, что эта страница относится только к блокам и строкам в 2D смысле, эти концепции расширяют к длинным массивам N-D. Размер блока только ограничивается в первой размерности, таким образом, блок включает все элементы в другие размерности; например, X(n:m,:,:,...)
. Кроме того, а не строки, массивы N-D имеют срезы, такие как X(p,:,:,...)
.
matlab.tall.transform
функция применяет одну функцию к каждому блоку длинного массива, таким образом, можно использовать его, чтобы применить мудрое блоком преобразование, фильтрацию или сокращение данных. Например, можно удалить строки с определенными значениями, сосредоточить и масштабировать данные, или обнаружить определенные обстоятельства и преобразовать определенные части данных. Эти рисунки показывают то, что происходит с блоками в массиве, когда они управляются matlab.tall.transform
.
Операция | Описание | Примеры |
---|---|---|
| Преобразование — количество строк в каждом блоке остается то же самое, но изменение значений. |
|
| При фильтрации — сокращено количество строк в каждом блоке, таким образом, блоки в новом массиве могут включать строки, первоначально существующие в других блоках. |
|
Типовой синтаксис, чтобы применять одноступенчатое преобразование
[tA, tB, tC, ...] = matlab.tall.transform(fcn, tX, tY, tZ, ...)
fcn
Общая функциональная подпись fcn
[a, b, c, ...] = fcn(x, y, z, ...)
fcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [x, y, z, ...]
блоки данных, которые умещаются в памяти. Блоки производятся путем извлечения данных из соответствующих входных параметров длинного массива [tX, tY, tZ, ...]
. Входные параметры [x, y, z, ...]
удовлетворите этим свойствам:
Весь [x, y, z, ...]
имейте тот же размер в первой размерности после любого позволенного расширения.
Блоки данных в [x, y, z, ...]
произойдите из того же индекса в высокой размерности, приняв, что длинный массив является неодиночным элементом в высокой размерности. Например, если tX
и tY
неодиночный элемент в высокой размерности, затем первым набором блоков может быть x = tX(1:20000,:)
и y = tY(1:20000,:)
.
Если первая размерность любого [tX, tY, tZ, ...]
имеет размер 1
, затем соответствующий блок [x, y, z, ...]
состоит из всех данных в том длинном массиве.
Выходные аргументы Выходные параметры [a, b, c, ...]
блоки, которые умещаются в памяти, чтобы быть отправленными в соответствующие выходные параметры [tA, tB, tC, ...]
. Выходные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Весь [a, b, c, ...]
должен иметь тот же размер в первой размерности.
Весь [a, b, c, ...]
вертикально конкатенированы с соответствующими результатами предыдущих вызовов fcn
.
Весь [a, b, c, ...]
отправляются в тот же индекс в первой размерности в их соответствующих целевых выходных массивах.
Функциональные правила — fcn
должен удовлетворить функциональному правилу:
F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]
: Применение функции к конкатенации входных параметров должно совпасть с применением функции к входным параметрам отдельно и затем конкатенации результатов.
Пустые Входные параметры — Убедитесь, что fcn
может обработать вход, который имеет высоту 0. Пустые входные параметры могут произойти, когда файл пуст или если вы сделали большую фильтрацию на данных.
matlab.tall.reduce
применяет две функции к длинному массиву, с результатом первого шага, подаваемого, как введено к итоговому шагу сокращения. Функция сокращения неоднократно применяется к промежуточным результатам до одного итогового блока, который умещается в памяти, получен. В парадигме MapReduce этот процесс похож на "одну ключевую" операцию MapReduce, где промежуточные результаты все имеют тот же ключ и объединены на шаге сокращения.
Первый шаг похож на matlab.tall.transform
и имеет те же требования. Однако шаг сокращения всегда уменьшает промежуточные результаты вниз до одного блока, который умещается в памяти. Эти рисунки показывают то, что происходит с блоками в массиве, когда они управляются matlab.tall.reduce
.
Операция | Описание | Примеры |
---|---|---|
| Преобразование + Сокращение — количество строк в каждом блоке остается то же самое после первого шага, и затем промежуточные результаты уменьшаются до одного блока. |
|
| Фильтрация + Сокращение — количество строк в каждом блоке уменьшается в первом шаге. Затем промежуточные результаты уменьшаются до одного блока. |
|
Типовой синтаксис, чтобы применить двухступенчатое сокращение
[rA, rB, rC, ...] = matlab.tall.reduce(fcn, reducefcn, tX, tY, tZ, ...)
Функциональная подпись fcn
[a, b, c, ...] = fcn(x, y, z, ...)
Функциональная подпись reducefcn
[rA, rB, rC, ...] = reducefcn(a, b, c, ...)
Таким образом, входные длинные массивы [tX, tY, tZ, ...]
повреждаются в блоки [x, y, z, ...]
это - входные параметры к fcn
. Затем fcn
возвращает выходные параметры [a, b, c, ...]
это - входные параметры к reducefcn
. Наконец, reducefcn
возвращает конечные результаты [rA, rB, rC]
это возвращено matlab.tall.reduce
.
reducefcn
Требования для fcn
совпадают с теми, которые были обрисованы в общих чертах в Функциональных требованиях для fcn. Однако требования для reducefcn
отличаются.
Общая функциональная подпись reducefcn
[rA, rB, rC, ...] = reducefcn(a, b, c, ...)
reducefcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [a, b, c, ...]
блоки, которые умещаются в памяти. Блоками данных являются любой выходные параметры, возвращенные fcn
, или частично сокращенный выход из reducefcn
это управляется снова для дальнейшего сокращения. Входные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Входные параметры [a, b, c, ...]
имейте тот же размер в первой размерности.
Для данного индекса в первой размерности, каждой строке блоков данных [a, b, c, ...]
или происходит из входа или происходит от того же предыдущего вызова до reducefcn
.
Для данного индекса в первой размерности, каждой строке входных параметров [a, b, c, ...]
поскольку тот индекс происходит из того же индекса в первой размерности.
Output Arguments — All выходные параметры [rA, rB, rC, ...]
должен иметь тот же размер в первой размерности. Кроме того, они должны быть вертикально объединены с соответствующими входными параметрами [a, b, c, ...]
допускать повторные сокращения при необходимости.
Функциональные правила — reducefcn
должен удовлетворить этим функциональным правилам (до ошибки округления):
F(input) == F(F(input))
: Применение функции неоднократно к тем же входным параметрам не должно изменять результат.
F([input1; input2]) == F([input2; input1])
: Результат не должен зависеть от порядка конкатенации.
F([input1; input2]) == F([F(input1); F(input2)])
: Применение функции однажды к конкатенации некоторых промежуточных результатов должно совпасть с применением его отдельно, конкатенацией и применением его снова.
Пустые Входные параметры — Убедитесь, что reducefcn
может обработать вход, который имеет высоту 0. Пустые входные параметры могут произойти, когда файл пуст или если вы сделали большую фильтрацию на данных. Для этого вызова все входные блоки являются пустыми массивами правильного типа и размера в размерностях вне первого.
matlab.tall.movingWindow
и matlab.tall.blockMovingWindow
функции применяют функцию к окнам данных в длинном массиве. В то время как matlab.tall.transform
и matlab.tall.reduce
работайте с целыми блоками данных за один раз, функции движущегося окна работают с окнами данных, когда окно перемещается с начала в конец массива. Окна могут охватить между блоками данных, считанными из диска.
Эти рисунки показывают то, что происходит с блоками в массиве, когда они управляются matlab.tall.movingWindow
или matlab.tall.blockMovingWindow
.
Операция | Описание | Примеры |
---|---|---|
| Оконное преобразование — количество строк в каждом блоке остается то же самое, но изменение значений. Выход содержит результаты операций, выполняемых и на неполных и на полных окнах данных. Оба |
|
| Окна Windowed Filtering — Incomplete данных отбрасываются, таким образом, выход имеет меньше элементов, чем вход. Выходные данные содержат только результаты операций, выполненных в полных окнах данных. Оба |
|
Можно использовать matlab.tall.movingWindow
и matlab.tall.blockMovingWindow
применять оконные преобразования или фильтры к данным. Например, можно вычислить запаздывающее среднее значение или движущуюся медиану, или можно применить несколько операций целиком к тому же окну. Две функции отличаются этими способами:
matlab.tall.movingWindow
применяет fcn
ко всем окнам данных, независимо от того, завершены ли окна. matlab.tall.blockMovingWindow
применяет windowfcn
к неполным окнам данных, и применяет blockfcn
завершать окна данных.
matlab.tall.movingWindow
работает с одним окнами данных за один раз. matlab.tall.blockMovingWindow
работает с целыми блоками данных, содержащими несколько полных окон, который сокращает количество вызовов функции, требуемых в вычислении.
Синтаксис для применения операции скользящего окна к отдельным окнам данных
[tA, tB, tC, ...] = matlab.tall.movingWindow(fcn, window, tX, tY, tZ, ...)
Функциональная подпись fcn
должен быть
[a, b, c, ...] = fcn(x, y, z, ...)
Точно так же синтаксис, чтобы применить движущуюся операцию окна к целым блокам данных
[tA, tB, tC, ...] = matlab.tall.blockMovingWindow(windowfcn, blockfcn, window, tX, tY, tZ, ...)
Функциональные подписи windowfcn
и blockfcn
должен быть
[a, b, c, ...] = windowfcn(info, x, y, z, ...) [a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)
info
вход является структурой, которая содержит поля Window
и Stride
. Когда вы пишете функцию. используйте эти поля, чтобы выбрать окна данных в каждом блоке.
Для схемы общих правил, что fcn
, windowfcn
, и blockfcn
должен следовать, видеть Функциональные требования для fcn. Кроме info
введите, fcn
и windowfcn
имейте те же требования. Однако требования для blockfcn
отличаются, поскольку эта функция работает с целыми блоками данных.
windowfcn
Общая функциональная подпись windowfcn
[a, b, c, ...] = windowfcn(info, x, y, ...)
info
вход является структурой, обеспеченной matlab.tall.blockMovingWindow
это включает эти поля:
Stride
— Заданный размер шага между окнами (значение по умолчанию: 1). Установите это значение с 'Stride'
пара "имя-значение".
Window
— Заданный размер окна. Установите это значение с window
входной параметр.
windowfcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [x, y, z, ...]
блоки данных, которые умещаются в памяти. Блоки производятся путем извлечения данных из соответствующих входных параметров длинного массива [tX, tY, tZ, ...]
. Входные параметры [x, y, z, ...]
удовлетворите этим свойствам:
Все входные параметры [x, y, z, ...]
имейте тот же размер в первой размерности.
Блоки данных в [x, y, z, ...]
произойдите из того же индекса в высокой размерности, приняв, что длинный массив является неодиночным элементом в высокой размерности. Например, если tX
и tY
неодиночный элемент в высокой размерности, затем первым набором блоков может быть x = tX(1:20000,:)
и y = tY(1:20000,:)
.
Когда первая размерность любого [tX, tY, tZ, ...]
имеет размер 1
, соответствующий блок [x, y, z, ...]
состоит из всех данных в том длинном массиве.
Применение windowfcn
должен привести к сокращению входных данных к скаляру или срезу массива высоты 1.
Когда вход является матрицей, массивом N-D, таблицей или расписанием, применяя windowfcn
должен привести к сокращению входных данных в каждом из его столбцов или переменных.
Выходные аргументы Выходные параметры [a, b, c, ...]
блоки, которые умещаются в памяти, чтобы быть отправленными в соответствующие выходные параметры [tA, tB, tC, ...]
. Выходные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Все выходные параметры [a, b, c, ...]
должен иметь тот же размер в первой размерности.
Все выходные параметры [a, b, c, ...]
вертикально конкатенированы с соответствующими результатами предыдущих вызовов windowfcn
.
Все выходные параметры [a, b, c, ...]
отправляются в тот же индекс в первой размерности в их соответствующих целевых выходных массивах.
Функциональные правила — windowfcn
должен удовлетворить этому функциональному правилу:
F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]
: Применение функции к конкатенации входных параметров должно совпасть с применением функции к входным параметрам отдельно и затем конкатенации результатов.
blockfcn
Общая функциональная подпись blockfcn
[a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)
info
вход является структурой, обеспеченной matlab.tall.blockMovingWindow
это включает эти поля:
Stride
— Заданный размер шага между окнами (значение по умолчанию: 1). Установите это значение с 'Stride'
пара "имя-значение".
Window
— Заданный размер окна. Установите это значение с window
входной параметр.
Блоки данных bX, bY, bZ, ...
тот matlab.tall.blockMovingWindow
обеспечивает к blockfcn
имейте эти свойства:
Блоки содержат только полноразмерные окна. blockfcn
не должен задавать поведение для неполных окон данных.
Первое окно данных запускается в первом элементе блока. Последний элемент последнего окна является последним элементом блока.
blockfcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [bX, bY, bZ, ...]
блоки данных, которые умещаются в памяти. Блоки производятся путем извлечения данных из соответствующих входных параметров длинного массива [tX, tY, tZ, ...]
. Входные параметры [bX, bY, bZ, ...]
удовлетворите этим свойствам:
Все входные параметры [bX, bY, bZ, ...]
имейте тот же размер в первой размерности после любого позволенного расширения.
Блоки данных в [bX, bY, bZ, ...]
произойдите из того же индекса в высокой размерности, приняв, что длинный массив является неодиночным элементом в высокой размерности. Например, если tX
и tY
неодиночный элемент в высокой размерности, затем первым набором блоков может быть bX = tX(1:20000,:)
и bY = tY(1:20000,:)
.
Если первая размерность любого из вводов данных [tX, tY, tZ, ...]
имеет размер 1
, затем соответствующий блок [bX, bY, bZ, ...]
состоит из всех данных в том длинном массиве.
Применение blockfcn
должен привести к сокращению входных данных, таким образом, что результат имеет высоту, равную количеству окон в блоке. Можно использовать info.Window
и info.Stride
определить количество окон в блоке.
Если вход является матрицей, массивом N-D, таблицей или расписанием, то применение blockfcn
должен привести к сокращению входных данных в каждом из его столбцов или переменных.
Выходные аргументы Выходные параметры [a, b, c, ...]
блоки, которые умещаются в памяти, чтобы быть отправленными в соответствующие выходные параметры [tA, tB, tC, ...]
. Выходные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Все выходные параметры [a, b, c, ...]
должен иметь тот же размер в первой размерности.
Все выходные параметры [a, b, c, ...]
вертикально конкатенированы с соответствующими результатами предыдущих вызовов blockfcn
.
Все выходные параметры [a, b, c, ...]
отправляются в тот же индекс в первой размерности в их соответствующих целевых выходных массивах.
Функциональные правила — blockfcn
должен удовлетворить этому функциональному правилу:
F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]
: Применение функции к конкатенации входных параметров должно совпасть с применением функции к входным параметрам отдельно и затем конкатенации результатов.
Если окончательный результат от каких-либо из Поддерживаемых API имеет другой тип данных от входа, то необходимо задать 'OutputsLike'
пара "имя-значение", чтобы обеспечить один или несколько прототипных массивов, которые имеют тот же тип данных и атрибуты как соответствующие выходные параметры. Значение 'OutputsLike'
всегда массив ячеек, с каждой ячейкой, содержащей прототипный массив для соответствующего выходного аргумента.
Например, этот вызов matlab.tall.transform
принимает один длинный массив tX
как вход и возвращает два выходных параметра с различными типами, заданными прототипными массивами protoA
и protoB
. Выведите A
имеет тот же тип данных и атрибуты как protoA
, и аналогично для B
и protoB
.
C = {protoA protoB}; [A, B] = matlab.tall.transform(fcn, tX, 'OutputsLike', C)
Распространенный способ предоставить прототипные массивы состоит в том, чтобы вызвать fcn
с тривиальными входными параметрами соответствующего типа данных, начиная с выходных параметров, возвращенных fcn
имейте правильный тип данных. В этом примере функция преобразования принимает tall double, но возвращает tall table. Прототипный массив сгенерирован путем вызова fcn(0)
и прототип задан как значение 'OutputsLike'
.
ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA'); ds.SelectedVariableNames = {'ArrDelay', 'DepDelay'}; tt = tall(ds); tX = tt.ArrDelay; fcn = @(x) table(x,'VariableNames',{'MyVar'}); proto_A = fcn(0); A = matlab.tall.transform(fcn,tX,'OutputsLike',{proto_A});
Поместите всю аналитику в одну функцию, которую вы вызываете, чтобы работать непосредственно с данными, вместо того, чтобы использовать ненужные вложенные функции.
Эксперимент с помощью небольшого подмножества данных. Профилируйте свой код, чтобы найти и зафиксировать узкие места перед увеличением масштаба к целому набору данных, где узкие места могут быть значительно усилены.
Обратите внимание на ориентацию ваших данных, поскольку некоторые функции возвращают выходные параметры в различных формах в зависимости от входных данных. Например, unique
может возвратить или вектор-строку или вектор-столбец в зависимости от ориентации входных данных.
Блоки динамически сгенерированы во времени выполнения на основе доступной памяти компьютера. Убедитесь, что любая заданная функция сокращения соблюдает функциональное правило F([input1; input2]) == F([F(input1); F(input2)])
. Если это правило не соблюдено, то результаты могут значительно отличаться между испытаниями.
Блоки могут иметь любой размер в первой размерности, включая 0 или 1. Размер 0 или 1 может произойти в промежуточных вычислениях в результате операций фильтрации или сокращения. Убедитесь, что ваша функция делает правильную вещь для обоих из этих случаев. Один из признаков того, что функция не обрабатывает эти случаи должным образом, когда вы получаете сообщение об ошибке "Output is different size".
matlab.tall.blockMovingWindow
| matlab.tall.movingWindow
| matlab.tall.reduce
| matlab.tall.transform