Библиотека Scala FRP, позволяющая конструировать системы потоковой обработки сигналов. Библиотека имеет хороший фундамент в виде теории сетей Петри. Применялась как основа системы обработки речи в режиме реального времени, в качестве интеграционной платформы распределённой ETL-системы.
Доклад представлялся на конференции fpconf.ru (15.08.2015)
В первой лекции рассматриваются основные виды параллелизма и способы написания высокопроизводительных приложений.
В конце рассматривается поддержка параллелизма в Java.
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
В первой лекции рассматриваются основные виды параллелизма и способы написания высокопроизводительных приложений.
В конце рассматривается поддержка параллелизма в Java.
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыAlexey Paznikov
ЛЕКЦИЯ 1. Основные понятия стандарта MPI. Дифференцированные обмены
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
http://cpct.sibsutis.ru/~apaznikov/teaching
Доклад Кулагина И.И., Пазникова А.А., Курносова М.Г. "Оптимизация информационных обменов в параллельных PGAS-программах" на 3-й Всероссийской научно-технической конференции «Суперкомпьютерные технологии» (СКТ-2014)
29 сентября – 4 октября 2014 г., с. Дивноморское
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
ЛЕКЦИЯ 2. POSIX Threads. Жизненный цикл потоков. Планирование. Синхронизация
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
ЛЕКЦИЯ 3. Стандарт POSIX Threads
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
Многоядерные процессоры используются во всех серверах, рабочих станциях и мобильных устройствах. Написание многопоточных программ необходимо для обеспечения вертикальной масштабируемости, но, в отличие от однопоточных программ, их намного сложней отладить и протестировать, чтобы убедиться в корректности. Важно понимать какие именно гарантии дают те или иные конструкции языка и библиотеки при их многопоточном исполнении и какие подводные камни могут нарушить корректность кода. Доклад будет содержать краткое введение в теорию многопоточного программирования. Мы рассмотрим теоретические модели, которые используются для описания поведения многопоточных программ. Будут рассмотрены понятия последовательной согласованности и линеаризуемости (с примерами) и объяснено зачем это все-нужно программисту-практику. Будет показано как эти понятия применяются в модели памяти Java с примерами кода приводящего к неожиданным результатам с точки зрения человека, который с ней не знаком.
Доклад сделан для конференции Java Point Student Day 2016.
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 3. Стандарт POSIX Threads
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
ЛЕКЦИЯ 3. Реентерабельность. Сигналы. Локальные данные потоков. Принудительное завершение потоков
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
Многоядерные процессоры используются во всех серверах, рабочих станциях и мобильных устройствах. Написание многопоточных программ необходимо для обеспечения вертикальной масштабируемости, но, в отличие от однопоточных программ, их намного сложней отладить и протестировать, чтобы убедиться в корректности. Важно понимать какие именно гарантии дают те или иные конструкции языка и библиотеки при их многопоточном исполнении и какие подводные камни могут нарушить корректность кода. Доклад будет содержать краткое введение в теорию многопоточного программирования. Мы рассмотрим теоретические модели, которые используются для описания поведения многопоточных программ. Будут рассмотрены понятия последовательной согласованности и линеаризуемости (с примерами) и объяснено зачем это все-нужно программисту-практику. Будет показано как эти понятия применяются в модели памяти Java с примерами кода приводящего к неожиданным результатам с точки зрения человека, который с ней не знаком.
Доклад сделан для конференции Java Point Student Day 2016.
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...Alexey Paznikov
ЛЕКЦИЯ 6. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения. Модель памяти C++
Курс "Параллельные вычислительные технологии" (ПВТ), осень 2014
Сибирский государственный университет телекоммуникаций и информатики
преподаватель:
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
Осуществим вводный экскурс в Node.JS. Действительно это что-то новое и гениальное? Что оно может, а что нет? Кому будет полезен? В каких случаях применять, а в каких нет? На все эти вопросы я постараюсь ответить в своём докладе.
Создание и развитие отечественной платформы с открытым программным кодом для ...ARCCN
Доклад в рамках Международной конференции «Управление сетями электросвязи. Программно-конфигурируемые сети и виртуализация сетевых функций – SDN&NFV Russia 2016».
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
Теория языков программирования (немного об интерпретаторах, триадах, оптимизации, парсерах и прочее)
Compilers construction some lectures of whole course, it covers some methods on interpreters, optimisations, antlr, dsl (introduction)
Техносфера Mail.ru Group, МГУ им. М.В. Ломоносова.
Курс "Методы распределенной обработки больших объемов данных в Hadoop"
Видео лекции курса https://www.youtube.com/playlist?list=PLrCZzMib1e9rPxMIgPri9YnOpvyDAL9HD
5. Речевой портал: выделение признаков
MFCC (CMU sphinx4)
● обрабатывается дискретный сигнал
● есть модули
– функциональные, без состояния,
– с состоянием,
– с собственной буферизацией и задержкой
● в поток встроены управляющие сигналы – начало/конец речи
● обратные связи
заказ такси
объявления
6. 10мс фреймы
100мс задержки (latency)
длительный процесс распознавания (~1x)
• нельзя распознавать пакетно
реакция на события в реальном времени
• перебивание
• обратная связь от модуля произнесения
• телефония: соединение/занято
• диалог по второй линии
разветвлённые алгоритмы потоковой обработки
• выбор ветки обработки зависит от состояния
Речевой портал:
технологические потребности
9. Hello, World
object HelloSystem extends BaseTypedSystem{
val nameInput = input [String]("nameInput")
val helloOutput = output[String]("helloOutput")
(nameInput -> helloOutput).
map("Hello, "+_, "hello, + _")
}
val f = HelloSystem.
toStaticSystem.
toDynamicSystem.
toMapTransducer(
HelloSystem.nameInput,
HelloSystem.helloOutput)
val name = "World"
val hello = f(name)
val f = magic(HelloSystem)
val hello = f("World")
println(hello)
val s = HelloSystem.toStaticSystem
s.toDot().saveTo("helloSystem.dot")
11. •оценка текущего уровня громкости (мощности) и уровня фона
•сглаживание уровней
•подсчёт длительности условия: высокий уровень/низкий уровень
•переход в состояния: начало речи/речь/окончание речи/фон
•буферизация сигнала до момента принятия решения
•перенаправление сигнала речи на речевой выход
•формирование сигналов начала речи и окончания речи
•конфигурирование параметров оценки
Цепь детектирования речи VAD
(voice activity detection)
время
уровень
15dB
12. val currentStateLengthMs = state[Int]("currentStateLengthMs", 0)
continuousAudioInput.
map(_.timeFrame.deltaTimeMs, "deltaTimeMs").
addTo(currentStateLengthMs)
automaton.onAutomatonStateChanged.const(0).
saveTo(currentStateLengthMs, "len = 0")
VAD:
Подсчёт длительности текущего состояния
13. trait LevelsEstimationB extends Breadboard with InputB {
continuousAudioInput.
withState(levels).
stateMap({
case (levelsValue,mediaFrame) =>
val newLevelsValue = levelsValue.nextLevels(mediaFrame.energyDb)
(newLevelsValue,(newLevelsValue,mediaFrame))
},"energyLevel") >> mediaFrameWithLevels
(mediaFrameWithLevels -> newLevels).map(_._1, "_._1")
}
VAD:
Оценка уровня сигнала/фона
14. trait Breadboard extends BaseTypedSystem {
val settings: VadSettings
val speechEndBufferMs = settings.speechEndDecisionMs
val frameSizeMs = 10
//internal contacts for sub schemes interconnections
lazy val mediaFrameWithLevels =
contact[(Levels, MediaFrame)]("mediaFrameWithLevels")
lazy val newLevels = contact[Levels]("newLevels")
lazy val speechSurelyStarted = contact[Any]("speechSurelyStarted")
lazy val speechSurelyFinished = contact[Any]("speechSurelyFinished")
// The state of VAD algorithm
lazy val currentStateLengthMs = state[Int]("currentStateLengthMs", 0)
lazy val speechBufferReversed =
state[List[MediaFrame]]("speechBufferReversed", List())
lazy val levels = state[Levels]("levels", Levels())
}
Макетная плата (breadboard/protoboard)
Cake pattern
18. Примитивы
• обычные Scala-функции
• контакты
• управляемые переменные состояния
Базовые средства композиции
• map, flatMap, flatten, filter, collect, foreach, stateFlatMap
• + несколько специальных DSL для частых задач
• обратные связи (!) «из коробки»
Средства абстрагирования/агрегации
• обычные trait’ы Scala – cake pattern/breadboard
• подсистемы с типизированными входами/выходами –
мультифункции
Язык SynapseGrid
19. State DSL: работа с состоянием (stateMap, stateFlatMap, updateState, withState)
• Специализированные инструменты для numeric, для списков, для игнибиторных дуг
• Зависимые переменные (spreadsheet): (update, onChange, dependsOn)
• Накопление данных до сигнала сброса: lastJoinUntil
Automata DSL: конечный автомат на основе событий, поступающих на разные
контакты
Continuation DSL: конечный автомат на основе событий с одного контакта
Switcher DSL: взаимоисключающие ветви(If, ElseIf, Else)
Discrete time DSL: управление дискретным временем: redlinks, delayN
Exception DSL: обработка исключений: tryMap, success, recover, unhandled
Инструментарий DSL/API
21. Обрабатываемые данные – immutable сигналы:
case class Signal[T](contact:Contact[T], data:T)
Signal(nameInput, "World")
Signal(helloOutput, "Hello, World.")
Текущее состояние исполнения системы в дискретный момент i:
Seq[Signal[_]]
State(0) == Seq(Signal(nameInput, "World"))
State(1) == Seq(Signal(helloOutput, "Hello, World."))
Signal, треллис
22. Треллис – развёртка состояния во времени.
val trellis = Seq(
Seq(Signal(nameInput, "World")),
Seq(Signal(helloOutput, "Hello, World."))
)
trellis: Seq[Signal[_]]
Треллис
Signal(nameInput, "World")
Signal(helloOutput, "Hello, World.")
23. Сеть Петри – модель перемещения фишек по
двудольному ориентированному графу.
Контакт – позиция
Связь – переход
Сигнал – фишка
Семантика Synapse Grid – перемещение фишек по
орграфу, пока все фишки не окажутся в выходных
позициях.
Накладные расходы – O(1) на один переход одного
сигнала.
Сеть Петри
Signal(nameInput, "World")
Signal(helloOutput, "Hello, World.")
24. • обычная функция – один вход/один выход
• функциональная композиция – линейная
f: X => Y
• мультифункция – несколько входов и
выходов
• системная композиция – произвольные
ветвления
^f: X1 x X2 => Y1 x Y2
g: Signal => Seq[Signal]
Подсистемы
(мультифункция)
25. SystemBuilder – скрипт создания графа системы. Выполняется на
этапе конфигурирования. Используются средства Scala: functions, cake
pattern, for comprehension.
StaticSystem – immutable граф системы.
Используется для статического анализа и для конвертации в *.dot
_.toStaticSystem
SignalProcessor – исполнение системы.
Выполняются функции, привязанные к переходам.
DynamicSystem – инкапсулированный процессор + состояние системы
= чёрный ящик. Принимает и возвращает сигналы:
Signal[Input] => Seq[Signal[Output]]
Transducer – выбран один вход + один выход построена функция,
скрывающая сигналы. Работает только с данными:
f(i:Input):Seq[Output]
Этапы конвертации системы
Runtime
Config time
Dev/test time
26. • никаких изменений кода системы, только
вызов .parallel у StaticSystem
• детерминированный результат эквивалентный
однопоточному запуску
• сериализованный доступ к state'у
• дополнительные накладные расходы на
параллельное исполнение. Поэтому имеет
смысл только при некоторых условиях.
Параллельное исполнение
val f = HelloSystem.
toStaticSystem.
toDynamicSystem.
toMapTransducer(
HelloSystem.nameInput,
HelloSystem.helloOutput)
val name = "World"
val hello = f(name)
val f = HelloSystem.
toStaticSystem.
parallel.
toMapTransducer(
HelloSystem.nameInput,
HelloSystem.helloOutput)
val name = "World"
val hello = f(name)
27. Хотим запустить сложную систему с подсистемами на нескольких хостах
Распределённый запуск: 1
29. На каждом хосте добавляется слой роутеров, каждый из которых представляет свою подсистему
После старта эктора он регистрируется в своём роутере.
Подсистема ничего не знает о расположении других систем. Взаимодействует только со своим
роутером
Распределённый запуск: 3
31. DSL для описания системы
• SystemBuilder – контейнер для
создаваемых связей, входов и выходов.
Минимальный набор методов
• DSL – pimp-my-library – добавлены helper-
методы, позволяющие упростить создание
разных связей
• Extensions – механизм, позволяющий
добавить в SystemBuilder своё состояние,
и затем пользоваться им при
конструировании системы.
• StaticExtensions – механизм,
позволяющий добавить в StaticSystem
дополнительную информацию. Например,
hint’ы для deployment descriptor’а
Устройство библиотеки
SignalProcessor
• RuntimeComponent – инкапсуляция
логики обработки данных на
определённом контакте.
• RuntimeSystem – index по контактам.
С каждым контактом связаны
RuntimeComponent’ы, которые
обрабатывают сигналы.
• unhandledExceptionHandler –
обработка исключений уровня системы
• redlinks – механизм, позволяющий
сделать «сверхвремя» внутри одного
дискретного шага
• SystemConvertingSpi – конвертация
static-системы в RuntimeComponent.
Используются PartialFunction.
• TrellisProducer –
развёртка/построение треллиса во
времени с использованием
RuntimeSystem.
32. trait SwitcherDsl extends SystemBuilderDsl{
class SwitcherBuilder[T](c: Contact[T],
name: String = "")
(implicit sb: SystemBuilder) {
def If(condition: T => Boolean) =
ElseIf(condition)
def ElseIf(condition: T => Boolean) = {
val id = nextId
conditions += Condition(id, condition)
createContactForId(id)
}
def Else = compileBranches
}
implicit class SwitcherContactOps[T](
val c: Contact[T])
(implicit sb: SystemBuilder) {
def switcher(name: String = "") =
new SwitcherBuilder[T](c, name)
}
}
DSL: switcher
val level = contact[Int]("level")
val sw = level.switcher("sw")
sw.If(_ > 10) >> highLevel
sw.ElseIf(_ > 3) >> mediumLevel
sw.Else() >> lowLevel
val level = contact[Int]("level")
level.filter(_ > 10) >> highLevel
level.filter(i => i<=10 && i > 3) >> mediumLevel
level.filter(_ <= 3) >> lowLevel
В докладе рассматривается библиотека SynapseGrid, относящаяся к классу FRP (functional reactive programming/data flow programming). В первой части описывается простой элегантный DSL для конструирования систем на основе SynapseGrid. Приводится пример простой системы. Во второй части описываются имеющиеся варианты исполнения готовой системы: - превращение системы в обычную функцию; - использование RX-интерфейса; - запуск в параллельном режиме на пуле потоков (как в parallel collections); - запуск на системе экторов Akka на одном хосте; - запуск на системе экторов Akka на нескольких хостах. В третьей части рассказывается о модульной архитектуре библиотеки и возможностях её расширения. В заключении описывается класс систем, реализуемых с помощью библиотеки. А именно, системы потоковой обработки данных с ветвлением. Приводятся примеры применения библиотеки в реальных проектах.
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
Современная тенденция на изменение подходов к программированию. тренд — в сторону функционального подхода.
Например, Spark — распределённая функциональная система почти реального времени. типичный допустимый latency — секунды. Используется подход micro batch
Для обработки речи latency — ниже — сотни миллисекунд. Здесь требуется ещё более компактные пакеты — нано пакеты, фреймы.
Надо сравнить с MatLab’овским Simulink
http://zhenilo.narod.ru/main/beginers/F42.html - сонофильм
http://matlab.ru/products/simulink Simulink
http://www.eclipse.org/atl/usecases/UML2AnyLogic/ - AnyLogic
(картинка из презентаций по РП)
описать архитектуру системы
телефония
Одна из задач РП – выделение признаков. Можно видеть, что есть несколько этапов обработки, разветвление потока данных, есть модули с состоянием и буферизацией. Также следует отметить, что прямо в поток аудиоданных встроены управляющие сигналы начала/окончания речи.
В системе присутствуют разнообразные обратные связи. Например,
когда пользователь говорит «Плохо слышно», это становится понятно на верхних уровнях ведения диалога, а изменения передаются на нижележащие уровни
когда пользователь начинает набирать DTMF, то необходимо отключить модуль распознавания речи и аннулировать результаты, полученные после определённого момента времени.
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
вставить график уровня сигнала и порогов принятия решения
Концепция макетной платы.
В электронике широко распространены специальные макетные платы. В них множество отверстий, и зачастую сделана разводка некоторых стандартных цепей, например, под БД или под микропроцессор. Затем инженер добавляет несколько компонентов, связывает их с другими частями, и получается новое устройство.
Аналогичный подход используется в SG. На основе cake-pattern’а. http://positiveland.ru/2011/10/birthdaycake/
Двухполюсники – связи между контактами
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
Пример прокачки нескольких каналов.
В систему вставлены две подсистемы –
Простые операции (map-flatMap)
Управляемое состояние
Подсистемы
Для описания языка программирования необходимо описать три основных элемента: примитивы, средства композиции и средства абстрагирования.
…
Мультифункция – функциональная конструкция, имеющая несколько входов и несколько выходов.
DSL разбит на отдельные API
Превращение в функцию
Использование буферизованной динамической системы
Интеграция с rx
- превращение системы в обычную функцию; - использование RX-интерфейса; - запуск в параллельном режиме на пуле потоков (как в parallel collections); - запуск на системе экторов Akka на одном хосте; - запуск на системе экторов Akka на нескольких хостах.
Immutable
сигнал — данные, привязанные к контакту. Внешнее связывание
состояние — все контакты и привязанные к ним данные
сеть Петри — передвижение фишек по DAG
треллис — развёртка состояния во времени
дискретное время, вложенное дискретное время для подсистем, красные ссылки
Immutable
сигнал — данные, привязанные к контакту. Внешнее связывание
состояние — все контакты и привязанные к ним данные
сеть Петри — передвижение фишек по DAG
треллис — развёртка состояния во времени
дискретное время, вложенное дискретное время для подсистем, красные ссылки
Семантика кода на языке SG — исполнение в дискретном времени сети Петри
встроенная явная параллельность семантики
Обычная функция имеет один вход и один выход.
Подсистема имеет несколько входов и несколько выходов.
Семантика такой конструкции выражается с помощью функции на сигналах. Однако в пространстве данных такая подсистема выглядит как мультифункция.
Выбранные подсистемы можно завернуть в эктор
Преимущества для SynapseGrid
параллельное исполнение кода подсистем
интеграция на верхнем уровне
supervisor – fault tolerance
распределённый запуск на нескольких хостах
Преимущества для Akka
типизация экторов (входов и выходов)
наблюдаемые связи между экторами
Пример использования switcher’а.
В зависимости от уровня сигнала мы направляем данные на один из выходов. Причём условия не являются взаимоисключающими.
Добавляем картинку для switcher’а
Spark + + Akka
SynapseGrid отлично вписывается в экосистему BigData, предоставляя развитые возможности по распределённой потоковой обработке данных. Планируется добавить возможность запуска SG на инфраструктуре Hadoop/Spark.
Hadoop
Типичные задержки – несколько минут
Spark
Задержку можно сделать до 1 секунды
SynapseGrid
Задержки порядка 10мс
телефония
Формируется сигнал окончания речи, а данные из буфера направляются на выход SpeechOutput
Алгоритм может находиться в одном из 5 состояний – инициализация фона, вне речи, подозрение на начало речи, внутри речи, подозрение на окончание речи.
Текущее состояние моделируется конечным автоматом, состояние которого находится в automatonState.
Например, находясь в состоянии InSpeech, при появлении сигнала на контакте newLevels
val newLevels = contact[Levels]("newLevels")
(mediaFrameWithLevels -> newLevels).map(_._1, "_._1")
newLevels.saveTo(levels)
Единица обработки - фрейм, целое число, булево значение, опциональное значение. Оверхед на создание сигнала оправдан тем, что только организация вычислений управляется числами и булевскими значениями.