Мы находимся в начале проекта f #, включающего анализ данных потоковой передачи в реальном времени и исторический. Данные содержатся в объекте С# (см. Ниже) и отправляются как часть стандартного события .net. В режиме реального времени количество событий, которые мы обычно получаем, может значительно варьироваться от менее 1/сек до более 800 событий в секунду на инструмент и, следовательно, может быть очень раздираемым. Типичный день может накапливать 5 миллионов строк/элементов на каждый экземпляр
Общая версия структуры данных событий С# выглядит следующим образом:
public enum MyType { type0 = 0, type1 = 1}
public class dataObj
{
public int myInt= 0;
public double myDouble;
public string myString;
public DateTime myDataTime;
public MyType type;
public object myObj = null;
}
Мы планируем использовать эту структуру данных в f # двумя способами:
- Исторический анализ с использованием контролируемых && неконтролируемое машинное обучение (CRF, модели кластеризации и т.д.).
- Классификация потоков данных в режиме реального времени с использованием вышеуказанных моделей
Структура данных должна быть способна расти, поскольку мы добавляем больше событий. Это исключает array<t>
, поскольку оно не позволяет изменять размер, хотя он может использоваться для исторического анализа. Структура данных также должна иметь возможность быстрого доступа к последним данным и, в идеале, должна быть способна перейти к данным x. Это исключает Lists<T>
из-за линейного времени поиска и из-за отсутствия произвольного доступа к элементам, просто обход "только вперед".
В соответствии с этот пост, Set<T>
может быть хорошим выбором...
EDIT: ответ Инь Чжу дал мне дополнительную ясность именно в том, что я просил. Я отредактировал оставшуюся часть сообщения, чтобы отразить это. Кроме того, предыдущая версия этого вопроса была запутана введением требований к историческому анализу. Я опустил их.
Ниже приведено разбиение шагов процесса реального времени:
- Получено событие в реальном времени
- Это событие помещается в структуру данных. Это структура данных, которую мы пытаемся определить. Должна ли она быть
Set<T>
или какой-либо другой структурой? - Подмножество элементов либо извлекается, либо каким-то образом повторяется для целей генерации признаков. Это будет либо последние n строк/элементов структуры данных (т.е. Последние 1000 событий или 10000 событий), либо все элементы за последние x сек/мин (т.е. Все события за последние 10 минут). В идеале нам нужна структура, которая позволяет нам делать это эффективно. В частности, имеет значение структура данных, которая допускает случайный доступ n-го элемента без итерации через все остальные элементы.
- Функции для модели создаются и отправляются в модель для оценки.
- Мы можем сократить структуру данных более старых данных для повышения производительности.
Итак, вопрос заключается в том, какая лучшая структура данных используется для хранения событий потоковой передачи в реальном времени, которые мы будем использовать для генерируемых функций.