Ответ 1
HDF5, к которому можно получить доступ через h5py или PyTables, предназначен для работы с очень большими наборами данных. Оба интерфейса работают хорошо. Например, как h5py, так и PyTables имеют автоматическое сжатие и поддерживают Numpy.
Я заинтересован в мониторинге некоторых объектов. Я ожидаю получить около 10000 точек данных каждые 15 минут. (Может быть, не поначалу, но это "общий бал" ). Я также хотел бы получать ежедневную, еженедельную, ежемесячную и годовую статистику. Не важно хранить данные в самом высоком разрешении (15 минут) более двух месяцев.
Я рассматриваю различные способы хранения этих данных и рассматриваю классическую реляционную базу данных или базу данных schemaless (например, SimpleDB).
Мой вопрос в том, как лучше всего это сделать? Я бы очень предпочел решение с открытым исходным кодом (и бесплатное) с запатентованным дорогостоящим.
Небольшое примечание: я пишу это приложение в Python.
HDF5, к которому можно получить доступ через h5py или PyTables, предназначен для работы с очень большими наборами данных. Оба интерфейса работают хорошо. Например, как h5py, так и PyTables имеют автоматическое сжатие и поддерживают Numpy.
RRDTool Тоби Отейкер, определенно! Это с открытым исходным кодом, оно предназначено для таких случаев.
EDIT:
Чтобы предоставить несколько основных моментов: RRDTool хранит данные временных рядов в базе данных с циклическим распределением. Он хранит необработанные данные в течение определенного периода времени, а затем конденсирует его конфигурируемым образом, поэтому вы можете получить мелкозернистые данные за месяц, усредненные данные за неделю в течение последних 6 месяцев и усредненные данные за месяц для последнего 2 года. В качестве побочного эффекта ваша база данных остается тем же самым размером все время (так что вы не будете вспотеть, что ваш диск может работать полностью). Это была сторона хранения. На стороне поиска RRDTool предлагает запросы данных, которые сразу же превращаются в графики (например, png), которые вы можете легко включить в документы и веб-страницы. Это прочное твердое, проверенное решение, которое является очень обобщенной формой по сравнению с его предшественником MRTG (некоторые из них, возможно, слышали об этом). И как только вы войдете в него, вы снова и снова будете использовать его снова.
Для краткого обзора и кто использует RRDTool, см. также здесь. Если вы хотите посмотреть, какие виды графики вы можете создать, убедитесь, что вы смотрите на gallery.
текстовые файлы? Непонятно, что ваши 10-кратные точки данных за 15 минут переходят на байты, но в любом случае текстовые файлы легче хранить/архивировать/переносить/манипулировать, и вы можете проверить их напрямую, просто взглянув на них. довольно легко работать с Python.
Это довольно стандартное хранилище данных.
Множество "фактов", организованных рядом измерений, одним из которых является время. Много агрегации.
Во многих случаях простые плоские файлы, которые вы обрабатываете с помощью простых алгоритмов агрегации, основанных на defaultdict
, будут творить чудеса - быстро и просто.
Посмотрите Эффективное хранение 7.300.000.000 строк
Существует база данных с открытым исходным кодом для активной разработки (только для .NET), которую я написал. Он может хранить массивные суммы (террабайты) однородных данных в "двоичном плоском файле". Все использование ориентировано на потоки (вперед или назад). Мы активно используем его для хранения и анализа складских тиков в нашей компании.
https://code.google.com/p/timeseriesdb/
// Create a new file for MyStruct data.
// Use BinCompressedFile<,> for compressed storage of deltas
using (var file = new BinSeriesFile<UtcDateTime, MyStruct>("data.bts"))
{
file.UniqueIndexes = true; // enforces index uniqueness
file.InitializeNewFile(); // create file and write header
file.AppendData(data); // append data (stream of ArraySegment<>)
}
// Read needed data.
using (var file = (IEnumerableFeed<UtcDateTime, MyStrut>) BinaryFile.Open("data.bts", false))
{
// Enumerate one item at a time maxitum 10 items starting at 2011-1-1
// (can also get one segment at a time with StreamSegments)
foreach (var val in file.Stream(new UtcDateTime(2011,1,1), maxItemCount = 10)
Console.WriteLine(val);
}