Лучшие в своем классе индексирующие структуры данных для чрезвычайно больших временных рядов

Я хотел бы спросить у коллег по SO's их мнения относительно лучших в своем роде структур данных, которые будут использоваться для индексации временных рядов (также называемых столбцовыми данными, также известными как плоские линейные).

Существуют два основных типа временных рядов, основанные на характеристике выборки/дискретизации:

  1. Регулярная дискретизация (каждая выборка берется с общей частотой)

  2. Нерегулярная дискретизация (выборки берутся в произвольные моменты времени)

Запросы, которые потребуются:

  1. Все значения во временном диапазоне [t0,t1]

  2. Все значения во временном диапазоне [t0,t1], которые больше/меньше v0

  3. Все значения во временном диапазоне [t0,t1], которые находятся в диапазоне значений [v0,v1].

Наборы данных состоят из суммированных временных рядов (которые преодолевают неравномерную дискретизацию) и многомерных временных рядов. Рассматриваемые наборы данных имеют размер около 15-20 ТБ, поэтому обработка выполняется распределенным образом, поскольку некоторые из описанных выше запросов приведут к наборам данных, превышающим физический объем памяти, доступный в любой системе.

Распределенная обработка в этом контексте также означает отправку требуемых вычислений, специфичных для данных, вместе с запросом временных рядов, чтобы вычисления могли выполняться как можно ближе к данным, чтобы уменьшить обмен данными между узлами (что-то вроде map/ редуцировать парадигму) - в скором времени близость вычислений и данных очень критична.

Еще одна проблема, с которой должен справиться индекс, заключается в том, что подавляющее большинство данных являются статическими/историческими (99,999...%), однако ежедневно добавляются новые данные, подумайте о «полевых сеньорах» или «рыночные данные». Идея / требование состоит в том, чтобы иметь возможность обновлять любые текущие вычисления (средние значения, garch и т. д.) с минимально возможной задержкой, некоторые из этих текущих вычислений требуют исторических данных, некоторые из которых будут больше, чем можно разумно кэшировать.

Я уже рассматривал HDF5, он хорошо/эффективно работает с небольшими наборами данных, но начинает тормозить по мере того, как наборы данных становятся больше, а также нет встроенных возможностей параллельной обработки во внешнем интерфейсе.

Ищу предложения, ссылки, дополнительную литературу и т. д. (решения C или C++, библиотеки)


person Xander Tulip    schedule 02.04.2012    source источник
comment
Запросы типов 1–3 часто называют «отчетами об ортогональном диапазоне».   -  person oldboy    schedule 11.04.2012
comment
dba.stackexchange.com/questions/16583/   -  person Martin Ba    schedule 17.04.2012
comment
@Martin: Спасибо за это, но проблема с наличием только молотка заключается в том, что все выглядит как гвоздь - постановка такого вопроса на сайте вопросов и ответов, ориентированном на db / dba, приведет к ответам с небольшим уклоном.   -  person Xander Tulip    schedule 17.04.2012
comment
@Xander: Не беспокойтесь - была причина, по которой я не оставил здесь никаких комментариев и просто связался с вопросом администратора базы данных. Мне просто интересно, как/можно ли решить вашу проблему в традиционной настройке СУБД. Не говоря уже о том, что это будет лучшим решением.   -  person Martin Ba    schedule 17.04.2012


Ответы (3)


Вы, вероятно, захотите использовать какое-то большое, сбалансированное дерево. Как упоминал Тобиас, B-деревья были бы стандартным выбором для решения первой проблемы. Если вы также заботитесь о быстрых вставках и обновлениях, в таких местах, как MIT и CMU, выполняется много новой работы с этими новыми «кэширующими забывчивыми B-деревьями». Чтобы обсудить реализацию этих вещей, найдите Tokutek DB, у них есть несколько хороших презентаций. как следующее:

http://tokutek.com/downloads/mysqluc-2010-fractal-trees.pdf

Вопросы 2 и 3 в целом намного сложнее, поскольку они включают поиск в диапазоне более высоких измерений. Стандартной структурой данных для этого будет дерево диапазонов (что дает O(log^{d -1}(n)) время запроса за счет хранения O(n log^d(n))). Как правило, вы не хотите использовать дерево k-d для чего-то подобного. Хотя верно то, что kd-деревья имеют оптимальные, O(n), затраты на хранение, фактом является то, что вы не можете выполнять запросы диапазона быстрее, чем O(n^{(d-1)/d}), если вы только использовать хранилище O (n). Для d = 2 это будет O (sqrt (n)) временной сложности; и, честно говоря, это не поможет, если у вас есть 10 ^ 10 точек данных (кто хочет ждать завершения O (10 ^ 5) операций чтения с диска в простом запросе диапазона?)

К счастью, похоже, что в вашей ситуации вам действительно не нужно слишком беспокоиться об общем случае. Поскольку все ваши данные поступают из временных рядов, у вас всегда есть не более одного значения для каждой временной координаты. Гипотетически вы могли бы просто использовать запрос диапазона, чтобы получить некоторый интервал точек, а затем, когда пост-процесс проходит и применять ограничения v поточечно. Это было бы первое, что я бы попробовал (после получения хорошей реализации базы данных), и если это сработает, то все готово! На самом деле имеет смысл пытаться оптимизировать последние два запроса только в том случае, если вы продолжаете сталкиваться с ситуациями, когда количество точек в [t0, t1] x [-infty,+infty] на порядки больше, чем количество точек в [t0 ,t1] x [v0, v1].

person Mikola    schedule 14.04.2012
comment
С другой стороны, использование дополнительного логарифмического коэффициента в хранилище означает (при условии отсутствия больших констант) увеличение стоимости жестких дисков с 2000 долларов (20 ТБ * примерно 100 долларов за ТБ в сегодняшних ценах) до 80 000 долларов. Затраты на программиста менее одного года, возможно, это того стоило, но удачи, если ваш менеджер видит вещи таким образом. - person oldboy; 14.04.2012
comment
@mikola: очень интересно! заслуживают внимания любые структуры индексации временных рядов, использующие внутреннюю структуру моделируемой стоимости. - person Xander Tulip; 16.04.2012

Общие идеи:

Проблема 1 довольно распространена: создайте индекс, который помещается в вашу оперативную память и имеет ссылки на данные во вторичном хранилище (структура данных: семейство B-Tree). Проблема 2/3 довольно сложна, так как ваши данные настолько велики. Вы можете разделить свои данные на временные диапазоны и рассчитать мин./макс. для этого временного диапазона. Используя эту информацию, вы можете отфильтровать временные диапазоны (например, максимальное значение для диапазона равно 50, и вы ищете v0>60, тогда интервал отсутствует). Остальное нужно искать, просматривая данные. Эффективность во многом зависит от того, насколько быстро меняются данные.

Вы также можете сделать несколько индексов, комбинируя временные диапазоны более низких уровней, чтобы быстрее выполнять фильтрацию.

person Tobias Langner    schedule 02.04.2012
comment
Проблема использования структур b-дерева с временными рядами заключается в том, что большинство временных рядов моделируют «непрерывные» значения в дискретном смысле. например: температура комнаты при 30 градусах должна упасть до 25, прежде чем она сможет достичь 20, b-деревья не используют такие идеи, поэтому они неэффективны для индексации временных рядов. - person Xander Tulip; 16.04.2012
comment
для задачи 1 ваш комментарий не имеет для меня смысла. Если вы хотите найти все моменты времени, когда температура была 30 градусов, вам придется индексировать это, как бы вы ни получили данные. По поводу задач 2 и 3 - не вижу противоречия. На самом деле предполагается, что данные непрерывны - в противном случае работа с минимальным/максимальным значением, чтобы определить, что данные были между ними, не работает. - person Tobias Langner; 17.04.2012
comment
Пожалуйста, перечитайте мой первоначальный комментарий к вам. это должно иметь смысл, если вы работали с подобными данными в прошлом. - person Xander Tulip; 18.04.2012

Это будет очень трудоемко и сложно реализовать это самостоятельно. Я рекомендую вам использовать Кассандру. Cassandra может предоставить вам горизонтальную масштабируемость, избыточность и позволит вам запускать сложные функции уменьшения карты в будущем. Чтобы узнать, как хранить временные ряды в cassandra, ознакомьтесь с: http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra и http://www.youtube.com/watch?v=OzBJrQZjge0.

person Behrang Javaherian    schedule 18.04.2012
comment
Учитывая базовые требования, задержки и объемы данных, все, чем можно управлять, явно не соответствует требованиям. - person Xander Tulip; 18.04.2012